将 US/Eastern 转换为包括夏令时在内的 UTC Python
Convert US/Eastern to UTC including daylight savings Python
我真的很惊讶在 Python 中没有找到一个简单的方法来做到这一点。我们在12月写的,然后通过了,因为当时是冬天:
def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT):
"""
:param dt_or_str:
:return:
"""
eastern = pytz.timezone('US/Eastern')
# try:
if isinstance(dt_or_str, datetime):
new_date_str = dt_or_str.strftime(time_format)
new_date_obj = dt_or_str
else:
new_date_str = dt_or_str
new_date_obj = datetime.strptime(dt_or_str, time_format)
if not number_of_days:
utc_time = eastern.localize(
datetime.strptime(new_date_str, time_format),
is_dst=None).astimezone(pytz.utc)
else:
est_time = new_date_obj - timedelta(days=number_of_days)
utc_time = eastern.localize(est_time, is_dst=None).astimezone(pytz.utc)
utc_time = utc_time.replace(tzinfo=None)
这所做的是将您的时间增加 5 小时,使其成为 UTC。事实证明 Spring/Summer 东部时间仅比 UTC 晚 4 小时,因此我们的代码现在已损坏。
这是我们写的测试,在夏季不起作用:
def test_get_utc_time_incoming_string(self):
result = get_utc_time("2017-02-02 04:38")
self.assertEqual(result, datetime.datetime(2017, 2, 2, 8, 38))
如何将 EST 转换为全年可用的 UTC?我不想对其进行硬编码,因为夏令时每年都在变化。
在回答中找到这个:
def is_daylight_savings(timezone_name):
tz = pytz.timezone(timezone_name)
now = pytz.utc.localize(datetime.utcnow())
return now.astimezone(tz).dst() != timedelta(0)
所以现在这个:
def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT):
"""
:param dt_or_str:
:return:
"""
eastern = pytz.timezone(TIMEZONE)
it_is_daylight_savings = is_daylight_savings(TIMEZONE)
if isinstance(dt_or_str, datetime):
new_date_str = dt_or_str.strftime(time_format)
new_date_obj = dt_or_str
else:
new_date_str = dt_or_str
new_date_obj = datetime.strptime(dt_or_str, time_format)
if not number_of_days:
utc_time = eastern.localize(
datetime.strptime(new_date_str, time_format),
is_dst=it_is_daylight_savings).astimezone(pytz.utc)
else:
est_time = new_date_obj - timedelta(days=number_of_days)
utc_time = eastern.localize(est_time, is_dst=it_is_daylight_savings).astimezone(pytz.utc)
utc_time = utc_time.replace(tzinfo=None)
return utc_time
随着言论自由的消亡,粗鲁无礼的自由呈指数级增长
我真的很惊讶在 Python 中没有找到一个简单的方法来做到这一点。我们在12月写的,然后通过了,因为当时是冬天:
def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT):
"""
:param dt_or_str:
:return:
"""
eastern = pytz.timezone('US/Eastern')
# try:
if isinstance(dt_or_str, datetime):
new_date_str = dt_or_str.strftime(time_format)
new_date_obj = dt_or_str
else:
new_date_str = dt_or_str
new_date_obj = datetime.strptime(dt_or_str, time_format)
if not number_of_days:
utc_time = eastern.localize(
datetime.strptime(new_date_str, time_format),
is_dst=None).astimezone(pytz.utc)
else:
est_time = new_date_obj - timedelta(days=number_of_days)
utc_time = eastern.localize(est_time, is_dst=None).astimezone(pytz.utc)
utc_time = utc_time.replace(tzinfo=None)
这所做的是将您的时间增加 5 小时,使其成为 UTC。事实证明 Spring/Summer 东部时间仅比 UTC 晚 4 小时,因此我们的代码现在已损坏。
这是我们写的测试,在夏季不起作用:
def test_get_utc_time_incoming_string(self):
result = get_utc_time("2017-02-02 04:38")
self.assertEqual(result, datetime.datetime(2017, 2, 2, 8, 38))
如何将 EST 转换为全年可用的 UTC?我不想对其进行硬编码,因为夏令时每年都在变化。
在回答中找到这个:
def is_daylight_savings(timezone_name):
tz = pytz.timezone(timezone_name)
now = pytz.utc.localize(datetime.utcnow())
return now.astimezone(tz).dst() != timedelta(0)
所以现在这个:
def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT):
"""
:param dt_or_str:
:return:
"""
eastern = pytz.timezone(TIMEZONE)
it_is_daylight_savings = is_daylight_savings(TIMEZONE)
if isinstance(dt_or_str, datetime):
new_date_str = dt_or_str.strftime(time_format)
new_date_obj = dt_or_str
else:
new_date_str = dt_or_str
new_date_obj = datetime.strptime(dt_or_str, time_format)
if not number_of_days:
utc_time = eastern.localize(
datetime.strptime(new_date_str, time_format),
is_dst=it_is_daylight_savings).astimezone(pytz.utc)
else:
est_time = new_date_obj - timedelta(days=number_of_days)
utc_time = eastern.localize(est_time, is_dst=it_is_daylight_savings).astimezone(pytz.utc)
utc_time = utc_time.replace(tzinfo=None)
return utc_time
随着言论自由的消亡,粗鲁无礼的自由呈指数级增长