【问题标题】: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。

标签: python datetime dst pytz


【解决方案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。
    猜你喜欢
    • 2011-10-22
    • 2013-11-25
    • 2012-12-18
    • 1970-01-01
    • 2013-01-31
    • 2017-01-29
    • 2019-08-31
    • 2016-12-23
    • 2021-10-18
    相关资源
    最近更新 更多