如何将EST/EDT兑换成GMT?

wid*_*get 6 python gmt

我在列中有一些记录代表EST或EDT时间.我需要将这些时间转换为GMT时间.时间的格式是:

10/1/2010   0:0:0
10/1/2010   0:6:0
...
10/1/2010   23:54:0
...
10/3/2010   0:0:0
...
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?谢谢

unu*_*tbu 13

我知道在时区之间转换的最简单,最可靠的方法是使用第三方pytz模块:

import pytz
import datetime as dt

utc=pytz.utc
eastern=pytz.timezone('US/Eastern')
fmt='%Y-%m-%d %H:%M:%S %Z%z'

text='''\
10/1/2010   0:0:0
10/1/2010   0:6:0
10/1/2010   23:54:0
10/3/2010   0:0:0
'''

for datestring in text.splitlines():
    date=dt.datetime.strptime(datestring,"%m/%d/%Y %H:%M:%S")
    date_eastern=eastern.localize(date,is_dst=None)
    date_utc=date_eastern.astimezone(utc)
    print(date_utc.strftime(fmt))
Run Code Online (Sandbox Code Playgroud)

收益率:

2010-10-01 04:00:00 UTC+0000
2010-10-01 04:06:00 UTC+0000
2010-10-02 03:54:00 UTC+0000
2010-10-03 04:00:00 UTC+0000
Run Code Online (Sandbox Code Playgroud)

但请注意,您的数据未指定日期时间是在EST还是EDT时区.如果不指定EST或EDT,有时会出现模糊不清的情况.例如,'10/27/2002 1:30:00'将是不明确的:

>>> eastern.localize(datetime(2002, 10, 27, 1, 30, 00), is_dst=None)
AmbiguousTimeError: 2002-10-27 01:30:00
Run Code Online (Sandbox Code Playgroud)

因为这个时间由于夏令时而发生了两次.还有一些日期时间,如2002-04-07 02:30:00,不存在.请参阅此链接 ,以了解这些以及处理本地时间时出现的更奇怪的问题.

如果您愿意忽略这些棘手的角落情况,并且如果您的机器是在当地时区(例如EST/EDT)设置的,那么有一种方法可以在不需要安装的本地和UTC时区之间进行转换pytz.这个想法是转换datetime - > timetuple - > timestamp - > UTC datetime.转换链完成

dt.datetime.utcfromtimestamp(time.mktime(date.timetuple()))
Run Code Online (Sandbox Code Playgroud)

例如:

import time
import datetime as dt
import pytz

utc=pytz.utc
eastern=pytz.timezone('US/Eastern')
fmt='%Y-%m-%d %H:%M:%S %Z%z'

text='''\
10/1/2010   0:0:0
10/1/2010   0:6:0
10/1/2010   23:54:0
10/3/2010   0:0:0
3/13/2011   1:55:0
3/13/2011   3:00:0
'''
for datestring in text.splitlines():
    date=dt.datetime.strptime(datestring,"%m/%d/%Y %H:%M:%S")
    date_est=eastern.localize(date,is_dst=None)
    date_utc=date_est.astimezone(utc)
    date_utc2=dt.datetime.utcfromtimestamp(time.mktime(date.timetuple()))
    print('{d} --> {d_utc}    {d_utc2}'.format(
        d=date.strftime(fmt),
        d_utc=date_utc.strftime(fmt),
        d_utc2=date_utc2.strftime(fmt),
        ))
    assert date_utc.hour == date_utc2.hour
Run Code Online (Sandbox Code Playgroud)

产量

2010-10-01 00:00:00 EDT-0400 --> 2010-10-01 04:00:00 UTC+0000    2010-10-01 04:00:00 
2010-10-01 00:06:00 EDT-0400 --> 2010-10-01 04:06:00 UTC+0000    2010-10-01 04:06:00 
2010-10-01 23:54:00 EDT-0400 --> 2010-10-02 03:54:00 UTC+0000    2010-10-02 03:54:00 
2010-10-03 00:00:00 EDT-0400 --> 2010-10-03 04:00:00 UTC+0000    2010-10-03 04:00:00 
2011-03-13 01:55:00 EST-0500 --> 2011-03-13 06:55:00 UTC+0000    2011-03-13 06:55:00 
2011-03-13 03:00:00 EDT-0400 --> 2011-03-13 07:00:00 UTC+0000    2011-03-13 07:00:00 
Run Code Online (Sandbox Code Playgroud)

上面测试的最后两个日期显示,即使接近EST和EDT之间切换的时间,转换也能正常工作.


总之,使用备用方法(没有pytz),这里是如何将表示本地时间的datetime对象转换为表示GMT时间的datetime对象,反之亦然:

In [83]: import datetime as dt
In [84]: import time
In [85]: import calendar

In [86]: date=dt.datetime(2010,12,1,0,0,0)    
In [87]: date
Out[87]: datetime.datetime(2010, 12, 1, 0, 0)

In [88]: date_utc=dt.datetime.utcfromtimestamp(time.mktime(date.timetuple()))    
In [89]: date_utc
Out[89]: datetime.datetime(2010, 12, 1, 5, 0)

In [90]: date_local=dt.datetime.fromtimestamp(calendar.timegm(date_utc.timetuple()))    
In [91]: date_local
Out[91]: datetime.datetime(2010, 12, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)