Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python解析特定时区中的日期_Python_Datetime_Time_Timezone_Pytz - Fatal编程技术网

使用Python解析特定时区中的日期

使用Python解析特定时区中的日期,python,datetime,time,timezone,pytz,Python,Datetime,Time,Timezone,Pytz,如何获取此日期字符串: “2015-01-01” 并且,假设它在一个特定的时区(比如“US Mountain”),将它转换为POSIX时间戳 像这样: magic_parse_function("2015-01-01", pytz.timezone("US-Mountain")) -> 1420095600 我花了相当长的时间浏览文档和这个网站,玩有意识/无意识的datetime对象,希望找到一个不太疯狂的解决方案。以下情况不起作用,最后两行输出是相同的,它们应该相隔3600秒: im

如何获取此日期字符串:

“2015-01-01”

并且,假设它在一个特定的时区(比如“US Mountain”),将它转换为POSIX时间戳

像这样:

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

我花了相当长的时间浏览文档和这个网站,玩有意识/无意识的datetime对象,希望找到一个不太疯狂的解决方案。以下情况不起作用,最后两行输出是相同的,它们应该相隔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())
有三个步骤:

  • 将日期字符串转换为简单的
    datetime
    对象:

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

    import pytz # $ pip install pytz
    
    aware = pytz.timezone("US/Mountain").localize(dt, is_dst=None)
    
    is_dst=None
    对不明确或不存在的时间引发异常。给你

  • 获取POSIX时间戳:

    timestamp = aware.timestamp()
    
    .timestamp()
    自Python 3.3+以来就可用。看


  • 假设午夜不一定是正确的做法。并非每个时区每天都有当地午夜。有些人(如巴西)在DST春前一天从23:59:59跳到01:00:00。另外,看起来您已经找到了解决方案,使用
    本地化
    。为什么要注释掉它并使用replace?localize()和replace()对输出没有影响。我认为问题在于timetuple()会丢弃时区信息,因此我希望有人能告诉我另一种(即优雅的)从aware datetime对象中获取时间戳的方法。
    .replace()
    不正确。请参阅与您的特定输入相关的内容:最好使用
    datetime。strtime(“2015-01-01”,“Y-%m-%d”)
    而不是
    datetime(*map(int,'2015-01-01')。split('-'))
    @TreyHunner:
    。strtime()
    更强大、更精确。一般应使用它。对于这个示例,我选择了一个更简单(更容易理解的错误消息,例如pass
    '2015-01-32'
    )更明确、更高效的代码,它不需要OP就可以知道strftime格式的代码。最后,我使用timedelta解决方案在链接的答案中获取UNIX时间戳。我希望能有一些不那么“丑陋”的东西,但我想我必须升级到Python3。另外,我在实际实现中使用strtime。不过,地图是个很酷的把戏。