linux将时间(对于不同的时区)转换为UTC

Mik*_*yan 3 c linux timezone gcc

有没有办法,在linux中,有问题地获得给定时间字符串的UTC时间

Tue Dec  14 10:30:23 PST 2012
Tue Jan  4 11:30:23 EST 2013
Run Code Online (Sandbox Code Playgroud)

到UTC时间,无论(并且不更改)本地时区设置?

jfs*_*jfs 5

更新:最近的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
Run Code Online (Sandbox Code Playgroud)

产量

Fri Jan  4 16:30:23 UTC 2013
Fri Jan  4 00:30:23 UTC 2013
Fri Jan  4 16:30:23 UTC 2013
Run Code Online (Sandbox Code Playgroud)

两件事情:

  • 根据使用的时区,日期字符串可能被解释为不同的时刻
  • date默默地忽略Australia/Brisbane应该是的时区,UTC+10date解释EST为属于不同的时区.没有EST它会产生正确的时间:

    $ date -u -d 'TZ=":Australia/Brisbane" Tue Jan  4 11:30:23 2013'
    Fri Jan  4 01:30:23 UTC 2013
    
    Run Code Online (Sandbox Code Playgroud)

查找给定时间和时区缩写的所有可能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)))
Run Code Online (Sandbox Code Playgroud)

产量

所有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
Run Code Online (Sandbox Code Playgroud)