将纪元时间戳转换为日期时间
Converting Epoch timestamp to DateTime
你好我遇到了一个奇怪的问题,我的情况是我正在使用 c# 语言读取存储在 sqlite 数据库中的 google chrome 浏览器的历史记录。除了 chrome 以纪元格式存储的时间戳外,一切都很好我必须使用 php 将数据上传到服务器并将其存储在 MYSQL 数据库中。
现在我的问题是我无法将该纪元时间戳转换为基于 MYSQL 的日期时间。
对于 C#,我尝试了以下代码
public static DateTime FromUnixTime(long unixTime)
{
return epoch.AddSeconds(unixTime);
}
取自 here 我尝试了所有可用的解决方案 link 但它们对我的情况不起作用。
对于 PHP 我尝试了以下取自 here
的代码
echo date("Y-m-d H:i:s", substr($epoch, 0, 10));
但如果时间戳与示例中提到的相同,则转换正确,但使用我的纪元时间戳执行时 returns 年份错误。
我什至试图在 MYSQL 查询级别解决这个问题,所以我搜索并尝试了以下来自 here
的解决方案
select from_unixtime(floor(1389422614485/1000));
当我不替换示例纪元时间戳时,它确实有效,但当我放置自己的时间戳时,它不起作用
请帮助我摆脱这个奇怪的恼人问题,不管你在哪一层提供解决方案都是可以接受的,以下语言是首选
- C#
- PHP
- MYSQL查询
示例纪元时间戳如下
13209562668824233
我确实知道它的长度与示例中的不同,但请注意 chrome 确实有效地转换了它。
如 this answer 所述,Chrome 时间戳不等于 Unix 纪元时间。这就是为什么您无法从此类方法中获得预期结果的原因。它实际上是自 1601 年 1 月 1 日以来的微秒(与 Unix 纪元时间自 1970 年 1 月 1 日以来的秒数相对)。
您可以测试您的 WebKit 时间戳 here,在那里您会看到它 returns 2019 年 8 月 6 日星期二 10:57:48(UTC)。
所以要在代码中转换它,我们应该先减去 1970 和 1601 之间的差异(以微秒为单位),然后将值除以 100 万得到秒(C# 解决方案):
public static DateTime ConvertWebKitTime(long webkitEpoch)
{
const long epochDifferenceMicroseconds = 11644473600000000; // difference in microseconds between 1601 and 1970
var epoch = (webkitEpoch - epochDifferenceMicroseconds) / 1000000; // adjust to seconds since 1st Jan 1970
return DateTimeOffset.FromUnixTimeSeconds(epoch).UtcDateTime; // convert to datetime
}
PHP(64 位,无毫秒)的解决方案是
$ts = 13209562668824233;
$date = date_create("1601-1-1 UTC")
->modify((int)($ts/1000000)." Seconds")
->format('Y-m-d H:i:s')
; //"2019-08-06 10:57:48"
有关详细信息,请参阅:What is the format of Chrome's timestamps?
你好我遇到了一个奇怪的问题,我的情况是我正在使用 c# 语言读取存储在 sqlite 数据库中的 google chrome 浏览器的历史记录。除了 chrome 以纪元格式存储的时间戳外,一切都很好我必须使用 php 将数据上传到服务器并将其存储在 MYSQL 数据库中。 现在我的问题是我无法将该纪元时间戳转换为基于 MYSQL 的日期时间。 对于 C#,我尝试了以下代码
public static DateTime FromUnixTime(long unixTime)
{
return epoch.AddSeconds(unixTime);
}
取自 here 我尝试了所有可用的解决方案 link 但它们对我的情况不起作用。
对于 PHP 我尝试了以下取自 here
的代码echo date("Y-m-d H:i:s", substr($epoch, 0, 10));
但如果时间戳与示例中提到的相同,则转换正确,但使用我的纪元时间戳执行时 returns 年份错误。
我什至试图在 MYSQL 查询级别解决这个问题,所以我搜索并尝试了以下来自 here
的解决方案select from_unixtime(floor(1389422614485/1000));
当我不替换示例纪元时间戳时,它确实有效,但当我放置自己的时间戳时,它不起作用
请帮助我摆脱这个奇怪的恼人问题,不管你在哪一层提供解决方案都是可以接受的,以下语言是首选
- C#
- PHP
- MYSQL查询
示例纪元时间戳如下
13209562668824233
我确实知道它的长度与示例中的不同,但请注意 chrome 确实有效地转换了它。
如 this answer 所述,Chrome 时间戳不等于 Unix 纪元时间。这就是为什么您无法从此类方法中获得预期结果的原因。它实际上是自 1601 年 1 月 1 日以来的微秒(与 Unix 纪元时间自 1970 年 1 月 1 日以来的秒数相对)。
您可以测试您的 WebKit 时间戳 here,在那里您会看到它 returns 2019 年 8 月 6 日星期二 10:57:48(UTC)。
所以要在代码中转换它,我们应该先减去 1970 和 1601 之间的差异(以微秒为单位),然后将值除以 100 万得到秒(C# 解决方案):
public static DateTime ConvertWebKitTime(long webkitEpoch)
{
const long epochDifferenceMicroseconds = 11644473600000000; // difference in microseconds between 1601 and 1970
var epoch = (webkitEpoch - epochDifferenceMicroseconds) / 1000000; // adjust to seconds since 1st Jan 1970
return DateTimeOffset.FromUnixTimeSeconds(epoch).UtcDateTime; // convert to datetime
}
PHP(64 位,无毫秒)的解决方案是
$ts = 13209562668824233;
$date = date_create("1601-1-1 UTC")
->modify((int)($ts/1000000)." Seconds")
->format('Y-m-d H:i:s')
; //"2019-08-06 10:57:48"
有关详细信息,请参阅:What is the format of Chrome's timestamps?