使用python确定时间戳是不是在夏令时

Posted

技术标签:

【中文标题】使用python确定时间戳是不是在夏令时【英文标题】:Using python to determine if a timestamp is under daylight savings time使用python确定时间戳是否在夏令时 【发布时间】:2016-07-30 03:31:05 【问题描述】:

这不起作用:

t = os.path.getmtime(filename)
dTime = datetime.datetime.fromtimestamp(t)
justTime = dTime.timetuple()
if justTime.tm_isdst == 0 :
    tDelta = datetime.timedelta(hours=0)
else:
    tDelta = datetime.timedelta(hours=1)

相反,条件总是等于 1,尽管某些时间戳在白天节省时间内。

我正在尝试使 python 调用与基于 c 的调用的行为相匹配。

【问题讨论】:

文件系统将日期/时间戳存储为自纪元以来的秒数,其中不包括任何时区或 DST 信息。仅当您将纪元时间转换为可显示格式时才会添加。您要匹配哪个基于 c 的调用? 如果我认为我(只是)必须定义一个时区并要求 pytz 对其进行本地化,从而允许 DST。 您应该能够只使用您当前的时区而不是添加一个。 DST 不会跨时区应用于同一日期或时间。 这是一个 cvi (NI) 调用 GetFileTime()。 GetFileTime() 我认为是一个win32 API,对吗?另请参阅timeanddate.com/time/dst/events.html 【参考方案1】:

要确定给定时间戳是否对应于当地时区的夏令时 (DST):

import os
import time

timestamp = os.path.getmtime(filename)
isdst = time.localtime(timestamp).tm_isdst > 0

It may fail。要解决这些问题,您可以使用 pytz 模块获得对 tz 数据库的可移植访问:

from datetime import datetime
import tzlocal  # $ pip install tzlocal

local_timezone = tzlocal.get_localzone() # get pytz tzinfo
isdst = bool(datetime.fromtimestamp(timestamp, local_timezone).dst())

相关:Use Python to find out if a timezone currently in daylight savings time.

【讨论】:

【参考方案2】:

为什么你认为你的文件系统会写下带有时区的时间戳?

在服务器上,您坚持使用没有 DST 的 UTC。在桌面上,您应该查找 DST 更改的最新时刻(打开或关闭),并相应地更正时间。我不知道pytz 是否有这些信息,但这些信息绝对可以在网络上以机器可读的形式获得。

请注意,从 DST 过渡的某些时刻,本地时间的某些值会出现两次,并且无法判断特定时间戳(例如凌晨 2:30 ) 发生在切换之前或之后(一个小时内)。

【讨论】:

我正在尝试匹配基于 c 的调用的行为。 @Jiminion: 哪个基于 c 的调用? getmtime() 返回“自纪元以来的秒数”,它不在任何时区(它不在 UTC,也不在本地时区)。它在世界各地都是相同的数字(只要服务器的时间与所需的时钟同步,服务器使用哪个时区并不重要)。见Does Python's time.time() return the local or UTC timestamp? “自纪元以来的秒数”又名"Unix time" is in UTC。

以上是关于使用python确定时间戳是不是在夏令时的主要内容,如果未能解决你的问题,请参考以下文章

没有时区的时间戳中的夏令时时间偏移

python time模块常用方法小结

Python:如何将日期时间/时间戳从一个时区转换为另一个时区?

Spark:考虑夏令时将 GMT 时间戳转换为东部时间

在观察夏令时的同时解析本地时间的有序时间戳(到 UTC)

将 UTC 时间戳插入 MySQL - 夏令时时区