如何在不同时区的服务器间传递时间戳

如何在不同时区的服务器间传递时间戳,第1张

两个在不同时区的服务器之间要传递依赖时间戳的数据,假设所有服务上的时区均 设置正确 ,各自都取 UTC 时间戳作为基准数据。
版本1:在一开始直接使用 `time()` (PHP) 和 `timemktime(timetuple)` (Python), 经实验发现,这样取的只是本地化的时间戳(带有时区差异)
版本2:后来换个方法 (PHP 代码来自 stackoverflow):
$utc_str = gmdate("M d Y H:i:s", time());
$utc = strtotime($utc_str);
Python:
import time
import datetime
dt = datetimedatetimeutcnow()
now_float = timemktime(dttimetuple())
now = int(now_float)
经测试发现不符,strtotime 函数也是返回本地化时间。
还有什么办法?
------思考中的分隔线------
回想一下 Unix 时间戳的定义:指的是从Unix 0 时(1970年1月1号 0点0分0秒)到当前时间的秒数,而这里的 0 时也应当是带时区的!
这一点可以用代码来验证,在不同时区服务上执行以下代码结果会不同(以python为例)
import time
timemktime((1970, 1, 1, 0, 0, 0, 0, 0, 0))
以上代码在东八区服务器运行得到 -306000,在西五区得到 180000,所以,要想得到正确的 UTC 时间戳,必须要在本地时间戳上减去这个时区0时的时间戳值。
版本3:
Python:
import time
import date time
dt = datetimedatetimeutcnow()
utc_float = timemktime(dttimetuple()) - timemktime((1970, 1, 1, 0, 0, 0, 0, 0, 0))
utc_time = int(utc_float)
PHP,直接用 DateTime 对象的方法得到:
$dt = new DateTime('now',new DateTimeZone('UTC')); // or simply: new DateTime('UTC')
$utc = $dt->getTimestamp();
done


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10776665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存