Bash:从文件读取UTC时间戳并转换为不同目标时区的本地时间

0 投票
2 回答
1879 浏览
提问于 2025-04-18 03:52

我有一个文件,里面记录了用bash的date命令生成的UTC时间戳,格式如下:

'Sat Mar 15 01:30:01 UTC 2014'
'Sat Mar 15 01:30:16 UTC 2014'
'Sat Mar 15 02:00:01 UTC 2014'
'Sat Mar 15 02:00:12 UTC 2014'

我需要把这些时间戳转换成不同地区的本地时间。比如,把上面第一个时间转换成香港时间,第二个转换成新加坡时间,依此类推。我可以生成一些偏移量,这些偏移量可以用来计算本地时间。我的偏移量大概是这样的:

2:00
-5:00
 .
 .

一种可能的方法是用Python来解析这些日期,然后加上或减去偏移量。

不过,我在想,能不能直接用Bashdate来完成这个任务。我尝试过像这样增加或减少日期:

date -d 'Sat Mar 15 01:30:01 UTC 2014 2 hours'

但是,上面的做法会把指定的日期转换成我系统的日期,并加上2个小时,而我其实是想针对特定的时区来处理,而不想手动指定偏移量。

2 个回答

1

对于Python

In [1]: import datetime
In [2]: utcstring = 'Sat Mar 15 01:30:01 UTC 2014'
In [3]: offsetstring = '2:00'

现在解析这两个字符串

In [4]: utc = datetime.datetime.strptime(utcstring, '%a %b %d %H:%M:%S %Z %Y')
In [5]: offset = datetime.datetime.strptime(offsetstring, '%H:%M')

delta 是通过 timedelta 计算出来的。我们可以用这个 delta 来加减 datetime

In [6]: delta = datetime.timedelta(hours=offset.hour, minutes=offset.minute)

让我们来检查一下结果。

In [7]: utc + delta
Out[7]: datetime.datetime(2014, 3, 15, 3, 30, 1)

这可以转换回 string,方法如下:

In [9]: datetime.datetime.strftime(utc + delta, '%a %b %d %H:%M:%S %Y')
Out[9]: 'Sat Mar 15 03:30:01 2014'

想了解更多细节,可以查看: https://docs.python.org/2.7/library/datetime.html

1

我建议不要使用偏移量的方法,而是直接指定你想要的时区。例如,如果你想把一个日期转换成香港时间,可以使用GNU的date命令:

$ TZ='Asia/Hong_Kong' date -d 'Sat Mar 15 01:30:01 UTC 2014'
Sat Mar 15 09:30:01 HKT 2014

TZ是时区的变量。-d这个选项告诉date命令要从指定的字符串中读取时间。

如果你不指定TZ,那么它会使用你电脑的默认时区:

$ date -d 'Sat Mar 15 01:30:01 UTC 2014'
Fri Mar 14 18:30:01 PDT 2014

关于各国时区的列表可以在这里找到。

这种方法不适用于Mac OSX (BSD)版本的date,因为在这个版本中,-d的功能是不同的。

撰写回答