Python 3:到datetime的时间戳:这个额外的小时来自哪里?

Hum*_*art 7 datetime python-3.x

我正在使用以下功能:

# The epoch used in the datetime API.
EPOCH = datetime.datetime.fromtimestamp(0)

def timedelta_to_seconds(delta):
    seconds = (delta.microseconds * 1e6) + delta.seconds + (delta.days * 86400)
    seconds = abs(seconds)

    return seconds

def datetime_to_timestamp(date, epoch=EPOCH):
    # Ensure we deal with `datetime`s.
    date = datetime.datetime.fromordinal(date.toordinal())
    epoch = datetime.datetime.fromordinal(epoch.toordinal())

    timedelta = date - epoch
    timestamp = timedelta_to_seconds(timedelta)

    return timestamp

def timestamp_to_datetime(timestamp, epoch=EPOCH):
    # Ensure we deal with a `datetime`.
    epoch = datetime.datetime.fromordinal(epoch.toordinal())

    epoch_difference = timedelta_to_seconds(epoch - EPOCH)
    adjusted_timestamp = timestamp - epoch_difference

    date = datetime.datetime.fromtimestamp(adjusted_timestamp)

    return date
Run Code Online (Sandbox Code Playgroud)

并将它们与传递的代码一起使用:

twenty = datetime.datetime(2010, 4, 4)

print(twenty)
print(datetime_to_timestamp(twenty))
print(timestamp_to_datetime(datetime_to_timestamp(twenty)))
Run Code Online (Sandbox Code Playgroud)

并获得以下结果:

2010-04-04 00:00:00
1270339200.0
2010-04-04 01:00:00
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我得到一个额外的最后一次通话中加入小时,尽管有我的代码,就我所看到的,没有任何瑕疵.

这个额外的一小时来自哪里?

bob*_*nce 4

# Ensure we deal with `datetime`s.\ndate = datetime.datetime.fromordinal(date.toordinal())\n
Run Code Online (Sandbox Code Playgroud)\n\n

(这完全切断了一天中的时间,因为 \xe2\x80\x98ordinal\xe2\x80\x99 只是一个日期数字。这是你的意思吗?我怀疑不是。)

\n\n

无论如何,正如 Michael 所说,datetime.fromtimestamp为您提供一个 na\xc3\xafve 日期时间,对应于您的 POSIX (UTC) 时间戳的本地时间。所以当你调用\xe2\x80\x89\xe2\x80\x94

\n\n
date = datetime.datetime.fromtimestamp(adjusted_timestamp)\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将获得表示 2010-04-04T00:00:00 的 POSIX 时间戳的本地时间,当然,在 BST 中这要提前一个小时。这不会发生在返回方向,因为您的纪元是在一月,此时 BST 尚未生效。(但是,EPOCH如果您不在英国,您也会完全关闭。)

\n\n

您应该将 的两种用法替换datetime.fromtimestampdatetime.utcfromtimestamp.

\n\n

令人遗憾的是,继续保持当地时间的datetime可怕传统。time称它们为 \xe2\x80\x98na\xc3\xafve\xe2\x80\x99 并去掉 DST 标志只会让它们变得更糟。就我个人而言,我无法忍受使用datetime,更喜欢对所有内容使用整数 UTC 时间戳(转换为本地时区仅用于格式化)。

\n