是否有“本地”时间戳?

Posted

技术标签:

【中文标题】是否有“本地”时间戳?【英文标题】:Is there a "local" timestamp? 【发布时间】:2017-06-21 22:37:21 【问题描述】:

我可以从 UTC 时间戳转换,例如1417392000 到包括夏令时的本地日期时间对象,但是当我尝试将本地日期时间对象转换为“本地时间戳”时,我得到与以前相同的 UTC 时间戳。

我是不是在圈子里思考,它们是一样的?我应该从传入的 UTC 时间戳中保存“本地时间戳”。

这是我的代码

    print("UTC timestamp %d" % hour[0])
    day = self.get_day(hour)
    month = self.get_month(hour)
    year = self.get_year(hour)
    tz = pytz.timezone('Europe/Stockholm')
    utc_dt = datetime.utcfromtimestamp(int(hour[0])).replace(tzinfo=pytz.utc)
    print("UTC datetime %s" % utc_dt)
    dt = tz.normalize(utc_dt.astimezone(tz))
    print("STO datetime %s" % dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
    print("STO ts %d" % int(time.mktime(dt.timetuple())))
    print("STO timestamp %d" % utc_dt.astimezone(tz).timestamp())
    day = int(dt.strftime('%d'))
    month = int(dt.strftime('%m'))
    year = int(dt.strftime('%Y'))

输出

UTC timestamp 1417395600
UTC datetime 2014-12-01 01:00:00+00:00
STO datetime 2014-12-01 02:00:00 CET+0100
STO ts 1417395600
STO timestamp 1417395600

所有“时间戳”(即时间的整数表示)都是相同的。是否可以制作“本地时间戳”?数据类型应该是一个时间戳,它是一个数字并且在本地时间。

【问题讨论】:

【参考方案1】:

根据Wikipedia

Unix 时间(也称为 POSIX 时间或纪元时间)是一个系统 描述时间的瞬间,定义为秒数 自协调世界时 (UTC) 00:00:00 起已过去, 1970 年 1 月 1 日星期四

因此,无论您在哪个时区,历元都将始终以 UTC 时区计算。

出于显示目的,您可以将时间戳转换为本地时间,否则纪元的内部表示将始终使用 UTC 时区

【讨论】:

【参考方案2】:

正式时间戳

Unix timestamp 通常是指自 UTC 纪元以来的秒数。该值对时区是不变的。它允许全局事件排序,但会丢失时区信息。

保留时区

为了保存时区信息,标准格式是RFC3339,互联网上的日期和时间:时间戳。这只是编码日期+时间+时区的标准化格式。一些例子:

1985-04-12T23:20:50.52Z
1996-12-19T16:39:57-08:00
1990-12-31T23:59:60Z
1990-12-31T15:59:60-08:00

时区标准化而不保留时区

但是,这可能取决于您的要求。我曾经想记录一些与本地时间相关的事件,并且不介意丢失时区信息。我对本地时区中 1970-01-01T00:00:00 的时间戳进行了标准化。我现在对此有点不好意思,因为我认为这很容易引起混乱。

import time

# Number of seconds since 1970-01-01T00:00+LTZ (current timezone).
# unix timestamp - timezone offset in seconds
timestamp_localized = time.time() - time.mktime(time.gmtime(0))

但是,通过注意到 Python 具有一些本地时间和 UTC 特定函数,可以简化此语法,可能会失去清晰度。

import time
import calendar

# Number of seconds since 1970-01-01T00:00+LTZ (current timezone).
# Interpret local date and time as if it were UTC
timestamp_localized = calendar.timegm(time.localtime())

这两者的区别在于日历转换截断到秒,而差值计算包括小数秒。

【讨论】:

以上是关于是否有“本地”时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

如何将角度 UTC 时间戳转换为本地时间戳? [复制]

如何检查到 UNIX 时间戳之间是不是有时间变化

Python 的 time.time() 是不是返回本地或 UTC 时间戳?

oracle:如何获取本地时间戳而不是服务器时间戳

无论如何要在某个时间戳之后 rsync gsutil 文件?

将UTC时间戳转换为熊猫中的本地时区问题