为了账号安全,请及时绑定邮箱和手机立即绑定

将纪元时间戳转换为日期时间

将纪元时间戳转换为日期时间

PHP
芜湖不芜 2021-11-26 19:50:01
您好,我遇到了一个奇怪的问题,我的情况是我正在使用 c# 语言读取存储在 sqlite 数据库中的 google chrome 浏览器的历史记录。除了 chrome 以纪元格式存储的时间戳之外,一切都很好,我必须使用 php 将数据上传到服务器并将其存储在 MYSQL 数据库中。现在我的问题是我无法将该纪元时间戳转换为基于 MYSQL 的日期时间。对于 C# 我尝试了以下代码public static DateTime FromUnixTime(long unixTime) {     return epoch.AddSeconds(unixTime);     }从这里我尝试了该链接上所有可用的解决方案,但它们在我的情况下不起作用。对于 PHP,我尝试了从这里获取的以下代码echo date("Y-m-d H:i:s", substr($epoch, 0, 10));但如果时间戳与示例中提到的相同,则转换正确,但在使用我的纪元时间戳执行时返回错误的年份。我什至试图在 MYSQL 查询级别解决这个问题,所以我搜索并尝试了从这里获取的以下解决方案select from_unixtime(floor(1389422614485/1000));当我不替换示例纪元时间戳时它确实有效,但是当我放置自己的时间戳时它不起作用请帮助我摆脱这个奇怪的恼人的问题,无论您在哪一层提供解决方案都可以接受以下语言是首选C#PHPMYSQL 查询示例纪元时间戳如下13209562668824233我确实知道就长度而言,它与示例中的不同,但请注意,chrome 确实可以有效地进行转换。
查看完整描述

2 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

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"



查看完整回答
反对 回复 2021-11-26
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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


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

}


查看完整回答
反对 回复 2021-11-26
  • 2 回答
  • 0 关注
  • 242 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信