Есть ли способ в linux для проблемного получения времени UTC для заданной временной строки, например
Tue Dec 14 10:30:23 PST 2012
Tue Jan 4 11:30:23 EST 2013
до UTC, независимо от (и без изменения) настроек локального часового пояса?
Есть ли способ в linux для проблемного получения времени UTC для заданной временной строки, например
Tue Dec 14 10:30:23 PST 2012
Tue Jan 4 11:30:23 EST 2013
до UTC, независимо от (и без изменения) настроек локального часового пояса?
date -u -d "Tue Dec 14 10:30:23 PST 2012"
сообщает Fri Dec 14 18:30:23 UTC 2012
. Расхождение связано с тем, что 14 декабря 2012 года на самом деле пятница, а не вторник. Вероятно, он работает лучше с допустимым вводом...
Обновить: результат с недавней базой данных tz отличается: EST дает одно и то же смещение utc для данной даты (сравните с предыдущий результат). Хотя это не влияет на общий вывод о том, что разные временные интервалы могут использовать одну и ту же аббревиатуру, и поэтому одна и та же аббревиатура может соответствовать различным смещениям utc. См. Синхронизация даты/времени с сокращенным названием часового пояса в Python?
Сокращенные названия часовых поясов, такие как EST, могут быть неоднозначными.
#!/bin/sh
for tz in Australia/Brisbane Australia/Sydney America/New_York
do date -u -d"TZ=\":$tz\" Tue Jan 4 11:30:23 EST 2013"
done
Fri Jan 4 16:30:23 UTC 2013
Fri Jan 4 00:30:23 UTC 2013
Fri Jan 4 16:30:23 UTC 2013
Две вещи:
date
молча игнорирует часовой пояс Australia/Brisbane
, который должен быть UTC+10
т.е. date
интерпретирует EST
как принадлежащий другому часовому поясу. Без EST
он производит правильное время:
$ date -u -d 'TZ=":Australia/Brisbane" Tue Jan 4 11:30:23 2013'
Fri Jan 4 01:30:23 UTC 2013
Чтобы найти все возможные времена UTC для сокращенного сокращения времени и часового пояса, например, для 'Tue Jan 4 11:30:23 EST 2013'
:
#!/usr/bin/env python
from collections import defaultdict
from datetime import datetime
import pytz # $ sudo apt-get install python-tz
# or if you can't install system-wide
# $ pip install --user pytz
## Tue Dec 14 10:30:23 PST 2012
#naive_dt, tzname = datetime(2012, 12, 14, 10, 30, 23), 'PST'
## -> Fri Dec 14 18:30:23 2012 UTC
# Tue Jan 4 11:30:23 EST 2013
naive_dt, tzname = datetime(2013, 1, 4, 11, 30, 23), 'EST'
# Fri Jan 4 01:30:23 2013 UTC
# Fri Jan 4 00:30:23 2013 UTC
# Fri Jan 4 16:30:23 2013 UTC
# ambiguous
utc_times = defaultdict(list)
for zone in pytz.all_timezones:
dt = pytz.timezone(zone).localize(naive_dt, is_dst=None)
if dt.tzname() == tzname: # same timezone abbreviation
utc_times[dt.astimezone(pytz.utc)].append(zone)
for utc_dt, timezones in utc_times.items():
print("%s:\n\t%s" % (utc_dt.strftime('%c %Z'), '\n\t'.join(timezones)))
Все Tue Jan 4 11:30:23 EST 2013
интерпретации как UTC с соответствующими названиями часовых поясов:
Fri Jan 4 01:30:23 2013 UTC:
Australia/Brisbane
Australia/Lindeman
Australia/Queensland
Fri Jan 4 00:30:23 2013 UTC:
Australia/ACT
Australia/Canberra
Australia/Currie
Australia/Hobart
Australia/Melbourne
Australia/NSW
Australia/Sydney
Australia/Tasmania
Australia/Victoria
Fri Jan 4 16:30:23 2013 UTC:
America/Atikokan
America/Cayman
America/Coral_Harbour
America/Detroit
...
America/New_York
...
America/Toronto
Canada/Eastern
EST
EST5EDT
Jamaica
US/East-Indiana
US/Eastern
US/Michigan