【问题标题】:Parse a date in a specific timezone with Python使用 Python 解析特定时区的日期
【发布时间】:2023-03-06 05:43:01
【问题描述】:

如何获取这个日期字符串:

“2015-01-01”

并且,假设它位于特定时区(例如,“US-Mountain”),将其转换为 POSIX 时间戳?

像这样:

magic_parse_function("2015-01-01", pytz.timezone("US-Mountain")) -> 1420095600

我花了相当长的时间搜索文档和这个站点,使用有意识/无意识的日期时间对象,并且我希望找到一个不太疯狂的解决方案。下面的不行,最后两行输出是一样的,应该相隔3600秒:

import datetime
import time
import pytz
timestring = "2015-01-01"
pacific = pytz.timezone("US/Pacific")
mountain = pytz.timezone("US/Mountain")
(year, month, day) = timestring.split('-')
year = int(year)
month = int(month)
day = int(day)
unaware = datetime.datetime(year, month, day, 0, 0, 0, 0)
# aware_pacific = pacific.localize(unaware)
# aware_mountain = mountain.localize(unaware)
aware_mountain = unaware.replace(tzinfo=mountain)
aware_pacific = unaware.replace(tzinfo=pacific)
print time.mktime(aware_pacific.timetuple())
print time.mktime(aware_mountain.timetuple())

【问题讨论】:

  • 假设午夜不一定是正确的做法。并非每个时区每天都有当地午夜。有些(如巴西)在夏令时春季前夕从 23:59:59 跳到 01:00:00。
  • 另外,看起来你有解决方案,使用localize。你为什么将它注释掉并使用替换?
  • localize() 与 replace() 对输出没有影响。我认为问题在于 timetuple() 丢弃了时区信息,所以我希望有人可以告诉我另一种(即优雅的)方法来从感知的 datetime 对象中获取时间戳。
  • .replace() 不正确。见Datetime Timezone conversion using pytz
  • 与您的具体输入相关:How to get the first datetime of a day?

标签: python datetime time timezone pytz


【解决方案1】:

分为三个步骤:

  1. 将日期字符串转换成朴素的datetime对象:

    from datetime import datetime 
    
    dt = datetime(*map(int ,'2015-01-01'.split('-')))
    
  2. 获取时区感知的日期时间对象:

    import pytz # $ pip install pytz
    
    aware = pytz.timezone("US/Mountain").localize(dt, is_dst=None)
    

    is_dst=None 为不明确或不存在的时间引发异常。这里是more details about what is is_dst flag and why do you need it, see "Can I just always set is_dst=True?" section

  3. 获取 POSIX 时间戳:

    timestamp = aware.timestamp()
    

    .timestamp() 自 Python 3.3+ 起可用。见multiple solutions for older Python versions

【讨论】:

  • 最好使用datetime.strptime("2015-01-01", "%Y-%m-%d") 而不是datetime(*map(int ,'2015-01-01'.split('-')))
  • @TreyHunner:.strptime() 更强大、更精确。一般应该使用。对于这个例子,我选择了一个更简单(更容易理解的错误消息,例如,传递'2015-01-32')更明确和更高效的代码,不需要 OP 知道 strftime 格式代码。
  • 我最终使用 timedelta 解决方案来获取链接答案中的 UNIX 时间戳。我希望有一些不那么“丑陋”的东西,但我想我必须为此升级到 Python3。另外,我确实在实际实现中使用了 strptime 。不过,*map 是一个很酷的技巧。
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 2018-01-01
  • 2011-09-28
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2019-09-06
  • 2015-09-24
相关资源
最近更新 更多