Python 怎么知道一个时间戳是不是 utc 时间转过来的

2018-04-17 10:26:02 +08:00
 mzmxcvbn

新手一枚,以前一直以为时间戳是不带时区的,可今天发现 datetime.now().timestamp()和 datetime.utcnow().timestamp()转出来的时间戳不一样。 那么问题来了,拿到一个外部传进来的时间戳时,我应该用 utcfromtimestamp()呢,还是 fromtimestamp()去转成 datetime 形式

7562 次点击
所在节点    Python
53 条回复
rrfeng
2018-04-17 12:16:08 +08:00
看我之前发的,还有人不信。
/t/346227
mzmxcvbn
2018-04-17 12:22:18 +08:00
@rrfeng 最后的结论是啥,就是用第三方模块吗。。
lolizeppelin
2018-04-17 12:23:05 +08:00
用 unix 时间为 0 输出就知道了
mzmxcvbn
2018-04-17 12:46:22 +08:00
@bolide2005
@wwqgtxx
找了几个在线的时间戳网站,好像还真是这样:
datetime.now().timstamp()和 time.time()出来的就是标准 unix 时间戳。
那么问题来了,datetime.utcnow().timstamp()出来的这个是什么鬼。
bolide2005
2018-04-17 12:49:08 +08:00
@mzmxcvbn #40 看函数定义啊

Help on built-in function fromtimestamp:

fromtimestamp(...) method of builtins.type instance
timestamp[, tz] -> tz's local time from POSIX timestamp.

fromtimestamp 本来得到应该是你的本地时间,现在得到的却是 utc 时间了
bolide2005
2018-04-17 12:50:53 +08:00
@mzmxcvbn #44 之前说过了,是把 utc 时间当做本地时间转换的时间戳,可能是 bug 或者是 feature (滑稽
mzmxcvbn
2018-04-17 12:54:04 +08:00
@bolide2005
嗯啊,也就是说,datetime.now().timstamp()和 time.time()出来的就是标准 unix 时间戳。

对于外部传来的标准 unix 时间戳,用 fromtimestamp()拿到的就是本地时间的 datetime ;用 utcfromtimestamp()拿到的就是 utc 时间的 datetime。这样总结没问题吧。
bolide2005
2018-04-17 12:57:04 +08:00
@mzmxcvbn 对的,实际上因为 Python2 里面不存在 datetime.timestamp 方法,一般都是使用 time.time,就不会出现今天你说的这个 utcnow.timestamp 问题
mzmxcvbn
2018-04-17 13:04:19 +08:00
@bolide2005 真是万分感谢,帮忙解决了这个疑惑,不然以后很容易采坑。

@wwqgtxx 总结在 47 楼了,应该是没错了。

另外谢谢所有参与讨论和提供第三方库解决方法的朋友们
sampeng
2018-04-17 17:43:55 +08:00
搞清楚时间戳,时区,utc,cst,等等时间格式规则,问题迎刃而解。都有专门的 rfc 文档解释,当然,那个很晦涩,直接 google。一大把的教程。。。
只是用第三方库来处理问题,三个月不用。又得踩一次坑
bomb77
2018-04-17 18:02:57 +08:00
In [52]: datetime.datetime.fromtimestamp?
Docstring: timestamp[, tz] -> tz's local time from POSIX timestamp.
Type: builtin_function_or_method

In [53]: tz_cn = pytz.timezone('Asia/Shanghai')

In [54]: tz_utc = pytz.timezone('utc')

In [55]: datetime.datetime.fromtimestamp(0, tz_utc)
Out[55]: datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

In [56]: datetime.datetime.fromtimestamp(0, tz_cn)
Out[56]: datetime.datetime(1970, 1, 1, 8, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

In [57]: datetime.datetime.fromtimestamp(0)
Out[57]: datetime.datetime(1970, 1, 1, 8, 0)
raptor
2018-04-17 22:23:38 +08:00
两个字:约定

最好的方法是所有时间戳都带上时区,再约定下不带时区的情况下默认用哪个时区,一般最好是 UTC
janxin
2018-04-18 09:54:09 +08:00
timestamp 是时区相关的,你只要在同一时区下解决就 ok 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447412

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX