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

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

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

7733 次点击
所在节点    Python
53 条回复
explon
2018-04-17 10:28:27 +08:00
你应该先搞清时间戳的概念
turan12
2018-04-17 10:30:49 +08:00
Python 表示这还真不知道
NoAnyLove
2018-04-17 10:37:23 +08:00
看具体情况。理论上,timestamp 是没有时区概念的,所有的 timestamp 都是从 UTC 开始算。datetime.datetime.fromtimestamp 会将 timestamp 转换出来的时间转换到本地时区,但是不添加 tzinfo,所以属于 tz-naive 的本地时区时间;而 utcfromtimestamp 转换出来的 datetime 不进行时区转换,是 tz-naive 的 UTC 时间
mzmxcvbn
2018-04-17 10:37:30 +08:00
@explon 我的意思是如果我拿到一个时间戳,我想要一个 datetime 形式的 utc 时间。如果这个时间戳是从 datetime.now 转过来的,我用 utcfromtimestamp()就能拿到正确的值。但如果这个时间戳是从 datetime.utcnow 转过来的,我再用 utcfromtimestamp()就不对了,这种时候用 fromtimestamp()就行了。但只有时间戳应该怎么判断该用 utcfromtimestamp()还是 fromtimestamp()呢
wwqgtxx
2018-04-17 10:38:13 +08:00
我说一个物品的重量是 25,你帮我算算是公斤还是市斤
tabris17
2018-04-17 10:39:42 +08:00
timestamp 是 UTC 时间,你转换出来不一致说明你设置的 timezone 不对
pimin
2018-04-17 10:39:51 +08:00
这个问题问得我...
mzmxcvbn
2018-04-17 10:40:59 +08:00
@wwqgtxx 你的意思是我是要去问这个时间戳的来源,这个是 now.timestamp()转出来的还是 utcnow.timestamp()转出来的是吗。。。
laoyur
2018-04-17 10:41:10 +08:00
@mzmxcvbn 上面的 NoAnyLove 哥不是说了嘛,timestamp 本身都是从 UTC 算的
你用 utcfromtimestamp 还是 fromtimestamp 对结果没有差别,只是一个返回的是 utc 0 时区的 datetime object,另一个是 local 时区的 datetime object,两个对象指代的都是同一个时间点啊,有啥问题?
mzmxcvbn
2018-04-17 10:43:07 +08:00
@laoyur 我的意思是如果我拿到一个时间戳,我想要一个 datetime 形式的 utc 时间。如果这个时间戳是从 datetime.now 转过来的,我用 utcfromtimestamp()就能拿到正确的值。但如果这个时间戳是从 datetime.utcnow 转过来的,我再用 utcfromtimestamp()就不对了,这种时候用 fromtimestamp()就行了。但只有时间戳应该怎么判断该用 utcfromtimestamp()还是 fromtimestamp()呢
mzmxcvbn
2018-04-17 10:44:07 +08:00
@laoyur 因为我发现 datetime.now().timestamp()和 datetime.utcnow().timestamp()转出来的时间戳不一样。。。。
arischow
2018-04-17 10:48:46 +08:00
先去搞清楚 timezone-naive, timezone-aware
wwqgtxx
2018-04-17 10:50:05 +08:00
@mzmxcvbn 实际上只有 utcnow 的 timestamp 转换出来的才是标准时间戳,直接用 now 的 timestamp 并不是标准 unix 时间戳
bolide2005
2018-04-17 10:55:18 +08:00
取时间戳为啥不直接用 time.time()? datetime.timestamp 本身是用来做转换的,不是取时间戳;你用哪个时区转换就得用哪个时区反转
AndyMo
2018-04-17 10:58:12 +08:00
所以应该问一下那个外部时间戳的来源,问他时间戳用的是不是 utc 时间,不是的话还要问所用时区。不问的话无解。
mzmxcvbn
2018-04-17 10:59:28 +08:00
@bolide2005 我刚刚试了一下 time.time()也不是标准 unix 时间戳,有别的取标准时间戳的方法吗
mzmxcvbn
2018-04-17 11:01:05 +08:00
@wwqgtxx 万分感谢!我也是今天才知道 datetime.now().timestamp()取出来的不是标准时间戳。
wwqgtxx
2018-04-17 11:05:27 +08:00
@mzmxcvbn 按照 python 官方文档,time.time()的确是标准时间戳,不过你需要 int 转换一下
还有,java/javascript 中的时间戳是以毫秒为单位的,需要 int(time.time()*1000)
mzmxcvbn
2018-04-17 11:06:53 +08:00
@NoAnyLove 万分感谢!我整理一下你看对吗:如果确定传过来的是标准 unix 时间戳,我用 datetime.fromtimestamp()就能拿到一个 datetime 形式的 utc 时间。但如果对面不是标准的时间戳,我就要用 datetime.utcfromtimestamp()才能拿到一个 datetime 形式的 utc 时间。
laoyur
2018-04-17 11:07:22 +08:00
@mzmxcvbn
timestamp()是 py3 才有的吧
你要拿真正的时间戳,首先要保证 datetime 对象是有 tzinfo 的,而你用 datetime.now()或者 datetime.utcnow()生成的都是 naive 的对象,不带 tzinfo,所以你再用 timestamp()获得的自然也可能是不正确的时间戳了

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

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

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

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

© 2021 V2EX