在MAC OS机器上。我们如何使用shell脚本将2017-01-09T09:35:26Z中的日期转换为Timestamp

时间:2017-03-24 13:36:44

标签: macos shell timestamp

我尝试了一些转换方法,但都失败了。我无法正确解释输入日期格式。

以下是我用来转换的命令

date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"

我正在寻找适用于每个时区的命令

1 个答案:

答案 0 :(得分:2)

对于这么简单的问题, 多么麻烦。 (PS:我认为它没有显示错误消息,并且如果您使用的是最新的Mac,则最好使用OSX标签替换为macOS)。

通过阅读this帖子我发现的第一个问题。它解释说,为了让你的命令工作,缩写需要使用系统语言。这可以通过在命令前添加LANG=C来解决。

但是,您的命令仍然传递了以下错误:

Failed conversion of ``Tue Sep 28 19:35:15 EDT 2010'' using format ``%a %b %d %T %Z %Y''
date: illegal time format
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

然后,在查看man date时,我发现这行解释了-f参数:

  

-f 使用input_fmt作为格式字符串来解析提供的new_date而不是使用默认值                [[[mm] dd] HH] MM [[cc] yy] [.ss]格式。使用 strptime(3)进行解析。

然后,在man strptime我读到:

  

错误 - %Z格式说明符只接受时区缩写   本地的        时区,或价值" GMT"。这种限制是因为含糊不清        由于时区缩写的过载。一个这样的例子        EST是东部标准时间和东澳大利亚夏季        时间。

所以,我能够像这样执行你的命令:

LANG=C date -j -u -f '%a %b %d %T %Z %Y' 'Tue Sep 28 19:35:15 GMT 2010' +%s

或者,就像这样,

TZ=EDT LANG=C date -j -u -f '%a %b %d %T %Z %Y' 'Tue Sep 28 19:35:15 GMT 2010' +%s

但实际上两者并不是你想要的东西......

因此,您似乎被strptime的默认macOS版本中的已知错误所咬。

修改

但是,如果你有一个包含每个时区偏移量的列表(偏向GMT),你可以这样做:

TZ=EDT LANG=C date -juf '%a %b %d %T %z %Y' 'Tue Sep 28 19:35:15 -0400 2010' +%s

了解更多可能性this post