2011-09-27 83 views
0

我有一个字符串形式'20111014T090000'与关联的时区ID(TZID = America/Los_Angeles),我想 转换为UTC时间在几秒钟与适当的抵消。正确转换之间tz不知道时间,UTC和python工作时区

这个问题似乎是我的输出时间偏离了1小时(这是在PST时,它应该是PDT)和我使用pytz帮助timezo

import pytz 

def convert_to_utc(date_time) 
    # date_time set to '2011-10-14 09:00:00' and is initially unaware of timezone information 

    timezone_id = 'America/Los_Angeles' 
    tz = pytz.timezone(timezone_id); 

    # attach the timezone 
    date_time = date_time.replace(tzinfo=tz); 

    print("replaced: %s" % date_time);                   
    # this makes date_time to be: 2011-10-14 09:00:00-08:00 
    # even though the offset should be -7 at the present time 

    print("tzname: %s" % date_time.tzname()); 
    # tzname reports PST when it should be PDT 

    print("timetz: %s" % date_time.timetz()); 
    # timetz: 09:00:00-08:00 - expecting offset -7 

    date_time_ms = int(time.mktime(date_time.utctimetuple())); 
    # returns '1318611600' which is 
    # GMT: Fri, 14 Oct 2011 17:00:00 GMT 
    # Local: Fri Oct 14 2011 10:00:00 GMT-7 

    # when expecting: '1318608000' seconds, which is 
    # GMT: Fri, 14 Oct 2011 16:00:00 GMT 
    # Local: Fri Oct 14 2011 9:00:00 GMT-7 -- expected value 

我如何获得正确的偏移量基于时区ID?

+0

您需要调用'date_time.localize'。这是这里完全缺失的唯一基本成分。 – wberry

回答

3

下面的代码片段会做什么,你想

def convert(dte, fromZone, toZone): 
    fromZone, toZone = pytz.timezone(fromZone), pytz.timezone(toZone) 
    return fromZone.localize(dte, is_dst=True).astimezone(toZone) 

这里的关键部分是通过is_dst的本地化方法。

+0

基于文档,似乎is_dst标志可能不会解释并提供期望值:>>> dt = datetime(2002,10,27,1,30,0) >>> dt1 = eastern.localize( dt,is_dst = True) >>> dt1.strftime(fmt) '2002-10-27 01:30:00 EDT-0400' >>> dt2 = eastern.localize(dt,is_dst = False) > >> dt2.strftime(fmt) '2002-10-27 01:30:00 EST-0500' –

+0

'is_dst'参数是可选的,除非在模糊时间的情况下(即在“回退”期间当地时区中的同一小时发生两次)。剩下的时间转换将在没有它的情况下工作。该参数告诉'pytz'夏时制是否有效,或者您所提供的'datetime'对象是否有效。 – wberry

0

simple-date写使转换这样微不足道的(你需要版本0.2.1或更高版本此):

>>> from simpledate import * 
>>> SimpleDate('20111014T090000', tz='America/Los_Angeles').timestamp 
1318608000.0 
0

如果你的程序改变全球时区(临时)允许,你可以也可以这样做:

os.environ['TZ'] = 'America/Los_Angeles' 
t = [2011, 10, 14, 9, 0, 0, 0, 0, -1] 
return time.mktime(time.struct_time(t)) 

预期的1318608000.0被返回。

0

给定字符串转换成天真DateTime对象:

>>> from datetime import datetime 
>>> naive_dt = datetime.strptime('20111014T090000', '%Y%m%dT%H%M%S') 
>>> naive_dt 
datetime.datetime(2011, 10, 14, 9, 0) 

要附加的时区(使它成为意识到DateTime对象):

>>> import pytz 
>>> tz = pytz.timezone('America/Los_Angeles') 
>>> local_dt = tz.localize(naive_dt, is_dst=None) 
>>> print(local_dt.strftime("%Y-%m-%d %H:%M:%S %Z%z")) 
2011-10-14 09:00:00 PDT-0700 

注:is_dst=None用来引发异常对于不存在或模糊的当地时代。

>>> (local_dt - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() 
1318608000.0 

在你的问题的主要问题是:

要从认识DateTime对象得到POSIX时间戳

  1. 更换了tzinfo属性,tz.localize应改为使用
  2. mktime()作品与当地时间(您的计算机时区),而不是UTC。