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

时间:2012-12-04 16:36:24

标签: c linux gcc timezone

在linux中,有没有办法在给定的时间字符串(例如

)中获得UTC时间
Tue Dec  14 10:30:23 PST 2012
Tue Jan  4 11:30:23 EST 2013

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

2 个答案:

答案 0 :(得分:5)

更新:最近的tz数据库的结果不同:EST yields the same utc offset for a given date(与the previous result比较)。虽然它不影响一般结论,即不同的时区可以使用相同的缩写,因此相同的缩写可以对应于不同的utc偏移。见Parsing date/time string with timezone abbreviated name in 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

Output

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的{​​{1}}时区,即UTC+10date解释为属于不同的时区。没有EST它会产生正确的时间:

    EST

查找给定时间和时区缩写的所有可能UTC时间,例如$ date -u -d 'TZ=":Australia/Brisbane" Tue Jan 4 11:30:23 2013' Fri Jan 4 01:30:23 UTC 2013

'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))) 解释为UTC,并带有相应的时区名称:

Tue Jan  4 11:30:23 EST 2013

答案 1 :(得分:2)

date -u -d "Tue Dec 14 10:30:23 PST 2012"举报Fri Dec 14 18:30:23 UTC 2012。这种差异是因为2012年12月14日实际上是星期五,而不是星期二。有效输入可能会更好......