将纪元时间戳转换为DateTime

时间:2019-08-19 05:54:02

标签: c# php mysql epoch

您好,我遇到一个奇怪的问题,我的情况是我正在使用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));

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

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

  1. C#
  2. PHP
  3. MYSQL查询

示例纪元时间戳正在消失

13209562668824233

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

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分:1)

this answer所述,Chrome时间戳记不等于Unix纪元时间。这就是为什么您无法从此类方法获得预期结果的原因。实际上,这是自1601年1月1日以来的微秒(与1970年1月1日以来的Unix纪元的秒数​​相反)。

您可以测试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
}