将 Epoch 时间戳转换为 DateTime

Posted

技术标签:

【中文标题】将 Epoch 时间戳转换为 DateTime【英文标题】:Converting Epoch timestamp to DateTime 【发布时间】:2019-12-24 08:11:04 【问题描述】:

您好,我遇到了一个奇怪的问题,我的情况是我正在使用 c# 语言读取存储在 sqlite 数据库中的 google chrome 浏览器的历史记录。除了 chrome 以纪元格式存储的时间戳之外,一切都很好,我必须使用 php 将数据上传到服务器并将其存储在 mysql 数据库中。 现在我的问题是我无法将该纪元时间戳转换为基于 MYSQL 的日期时间。 对于 C#,我尝试了以下代码

public static DateTime FromUnixTime(long unixTime)

    return epoch.AddSeconds(unixTime);

取自 here 我在该链接上尝试了所有可用的解决方案,但在我的情况下它们不起作用。

对于 PHP,我尝试了以下代码,取自 here

echo date("Y-m-d H:i:s", substr($epoch, 0, 10));

但如果时间戳与示例中提到的相同,它会转换正确,但使用我的纪元时间戳执行时会返回错误的年份。

我什至尝试在 MYSQL 查询级别解决这个问题,所以我搜索并尝试了以下从 here 获取的解决方案

select from_unixtime(floor(1389422614485/1000));

当我不替换示例纪元时间戳时它确实有效,但是当我自己放置它时它不起作用

请帮助我摆脱这个奇怪的恼人问题,无论您在哪一层提供解决方案都可以接受以下语言是首选

    C# PHP MYSQL 查询

示例纪元时间戳如下

13209562668824233

我确实知道它的长度与示例中的不同,但请注意 chrome 确实可以有效地转换它。

【问题讨论】:

Related 时间戳应该是UTC+0,你应该是你的时区 我尝试了其他时区但没有用,但是#John 的链接有点意义,我虽然时间戳是从 1970 年开始,但在 chrome 中它是从 1601 年开始计算的,这很奇怪,但事实如此。 【参考方案1】:

正如this answer 所解释的,Chrome 时间戳不等于 Unix 纪元时间。这就是为什么您没有从这些方法中获得预期结果的原因。它实际上是自 1601 年 1 月 1 日以来的微秒(与 Unix 纪元时间自 1970 年 1 月 1 日以来的秒数相反)。

您可以测试您的 WebKit 时间戳 here,您会看到它在 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

【讨论】:

【参考方案2】:

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?

【讨论】:

你使用的是哪个php版本? PHP V7.2.21(64位!!)

以上是关于将 Epoch 时间戳转换为 DateTime的主要内容,如果未能解决你的问题,请参考以下文章

将 Epoch 时间戳转换为 sql server(人类可读格式)

如何将时间戳从十六进制格式转换为 EPOCH 时间戳?

如何将表示 EPOCH 时间的整数转换为 Athena (Presto) 中的时间戳?

如何在 Redshift 中将时间戳(具有毫秒)转换为 EPOCH

如何将文件的AIX时间戳转换为EPOCH

如何在标准 SQL 中将 Epoch 时间戳转换为日期