在Linux Bash中将ISO日期转换为自纪元以来的秒数

25

我有一个日期,以ISO格式YYYY-MM-DDTHH:SS(例如2014-02-14T12:30)表示。我想使用Linux Bash中的date命令将其转换为自纪元以来的秒数。

所有日期都是针对UTC区域设置的。

我知道这个问题很容易可以被归类为重复问题......有数十亿个关于将日期从一种格式转换为另一种格式的问题,但是我找不到我的特定情况。

谢谢……

2个回答

36

使用GNU date(来自GNU coreutils软件包),使用-d指定要解析的日期,使用%s指定时代秒数。

$ date -d"2014-02-14T12:30" +%s
1392381000

请注意,这将解释要解析的日期为您的本地时区。如果您想让date使用特定的时区,您必须指定,可以通过变量TZ(更改date的默认时区)或在日期字符串中进行指定。对于UTC:

$ TZ=UTC date -d"2014-02-14T12:30" +%s
1392381000

或者按照 ISO 8601 格式的字符串中:

$ date -d"2014-02-14T12:30Z" +%s
1392381000

请参考维基百科的ISO 8601词条,了解如何在日期字符串中指定其他时区。


1
这正是我尝试过的...但与http://www.epochconverter.com/上给出的数字相比似乎报告了错误的数字。你能解释一下发生了什么吗? - Gianluca Ghettini
我的意思是,“日期”输出似乎比www.epochconverter.com上给出的值晚了几个小时。 - Gianluca Ghettini
EDT选项不起作用。我有来自coreutils 8.4(Centos 6.0)的日期。 - Gianluca Ghettini
一个可能有效的替代方案是:$ TZ='America/Los_Angeles' date -d"2014-02-14T12:30" +%s - kguest
1
这个回答没有涉及时区问题,我已经编辑并添加了相关内容,希望这样可以。 - sleske
显示剩余3条评论

2

如果你安装了gdate,处理带有纳秒精度时区的日期字符串会更容易。

安装coreutils,你将同时获得gdate

在Mac上brew install coreutils

gdate --date="2010-10-02T09:35:58.203Z" +%s%N

这在将时间序列值插入InfluxDB时特别有用。
在shell脚本中,variable = $(gdate --date="2010-10-02T09:35:58.203Z" +%s%N)
echo $variable

1
你的回答似乎涉及到特定的UNIX变体(可能是MacOS X)。请澄清你所说的变体 - 否则这个答案只会让人困惑。例如,在Linux上没有“install”命令,在Debian上有一个“coreutils”包,但它不包含“gdate”(只有“date”)。 - sleske
嗨@sleske,抱歉我已经离开了这个项目,没有你所要求的环境信息。 - Mohammed Rafeeq

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