如何在Linux的shell脚本中将UTC时间转换为本地时间

6

I have a string of the format

20110724T080000Z

我希望在Linux的shell脚本中将一个时间转换为本地时间。我认为可以将其作为输入提供给date命令,但我似乎无法告诉date我的输入日期格式。

以下是需要翻译的内容:

date -d "20110724T080000Z" -u

会导致日期出现问题

date: invalid date `20110724T080000Z'

此外,“20110724T080000Z”格式的表单被称为什么?我试图通过谷歌搜索,但效果不佳。

看起来像是从RFC 3339格式中去除了标点符号。 - viraptor
4个回答

5
这是一个结合日期和时间的基本格式ISO8601 "basic format"date似乎无法解析20110724T080000Z,但如果您准备做一些字符串替换,它可以正确地解析20110724 08:00:00Z

4

date程序支持这两种格式:
yyyy-mm-ddTHH:MM:SS
yyyy-mm-dd HH:MM:SS

因此:

a=20110724T080000Z
b=${a:0:4}-${a:4:2}-${a:6:5}:${a:11:2}:${a:13:2}
date +%F_%T -d "${b} +0"

在我的语言环境中,会打印出2011-07-24_12:30:00


日期 -d "${a:0:-1} UTC"。这将删除最后一个字符(“Z”)并从UTC转换为本地。 - successfulmike
@successfulmike “date -d "${a:0:-1} UTC"输出date: invalid date ‘20110724T080000 UTC’。你在什么操作系统上使用哪个版本的date命令?我在Arch上使用的是 date (GNU coreutils) 9.1`。 - Small Boy

1

它被称为Zulu时间。它与UCT相同,而UCT以前被称为GMT。军用中使用它来指定UCT,以便在通信时没有混淆。

http://en.wikipedia.org/wiki/Date_(Unix)

根据维基百科,此命令应该可以正常工作:

date [-u|--utc|--universal] [mmddHHMM[[cc]yy][[.SS]] 此形式的唯一有效选项指定协调世界时。


0

你可以尝试利用perl:

perl -e 'print scalar localtime(shift), "\n"' 20110724T080000Z

虽然你可能需要稍微调整一下才能使其正常工作。好吧,我不知道为什么perl版本不能很好地完成它,但是这里有一个我尝试过的Ruby版本,虽然我无法很好地选择时间:

ruby -e "require 'date';print Date.strptime('20110724T080000Z','%Y%m%dT%H%M%SZ').ctime"

输出结果为:

Sun Jul 24 00:00:00 2011


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接