如何使用OS X BSD`date`命令将日期字符串转换为纪元时间戳?

tom*_*all 4 macos date

我有一个以下格式的日期字符串,Jul 27 23:59:59 2016 GMT我需要使用OS X BSD date命令将其转换为等效的纪元时间戳.

GNU date有一个很好的-d/ --date=STRING参数:

$ date -d "Jul 27 23:59:59 2016 GMT" +'%s'
1469663999
Run Code Online (Sandbox Code Playgroud)

dateOSX上的BSD 命令遗憾地没有这样的选项.

date -j -f "<FORMAT>" "Jul 27 23:59:59 2016 GMT" +'%s'似乎是要走的路,但我找不到写格式字符串.Apple的手册页指出:

date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

can be used to parse the output from date and express it in Epoch time.
Run Code Online (Sandbox Code Playgroud)

但这似乎并非如此:

$ date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
Failed conversion of ``Wed 13 Jul 2016 11:17:49 BST'' using format ``%a %b %d %T %Z %Y''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
        [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Run Code Online (Sandbox Code Playgroud)

如何使用OS X BSD date命令将此格式的日期字符串转换为纪元时间戳?


我似乎无法获得一个版本date,但我在OS X 10.11.5(El Capitan),如果这是重要的.

Mar*_*ell 7

你是说这个吗?

date -j -f "%a %b %d %T %Z %Y" "Wed Jul 13 11:30:27 BST 2016" +"%s"
1468405827
Run Code Online (Sandbox Code Playgroud)

我通过告诉date您输出的格式与您使用的格式相同来解决这个问题:

date -j +"%a %b %d %T %Z %Y"
Run Code Online (Sandbox Code Playgroud)

  • 我发现在调用 date 命令时需要添加 -u 选项才能转换为 UTC,否则它会使用本地计算机的时区并丢弃时间戳。 (3认同)

pah*_*pah 5

您的date命令以以下格式输出日期:

Wed 13 Jul 2016 11:17:49 BST (Format sequence is: "%a %d %b %Y %T %Z")
Run Code Online (Sandbox Code Playgroud)

并且您尝试使用表达式来解析它以匹配以下格式:

Wed Jul 13 11:17:49 BST 2016 (Format sequence is: "%a %b %d %T %Z %Y")
Run Code Online (Sandbox Code Playgroud)

导致:

使用格式“%a %b %d %T %Z %Y ”转换“Wed 13 Jul 2016 11:17:49 BST”失败

因此,基本上,您需要使用以下命令更改命令中的格式顺序:

$ date -j -f "%a %d %b %Y %T %Z" "`date`" +"%s"
Run Code Online (Sandbox Code Playgroud)

为了匹配Wed 13 Jul 2016 11:17:49 BST您的date命令默认输出的格式。

要使用基于相同格式的自定义日期:

 $ date -j -f "%a %d %b %Y %T %Z" "Wed 13 Jul 2016 11:17:49 BST" +"%s"
Run Code Online (Sandbox Code Playgroud)

关于[某些]格式字符串序列含义的一些参考:

  • %a 区域设置的工作日缩写名称(例如 Sun)
  • 一个月中的%d 天(例如,01)
  • %b 语言环境的月份名称缩写(例如 Jan)
  • %Y
  • %T 时间;与 %H:%M:%S 相同
  • %Z 字母时区缩写(例如 EDT)


小智 5

我在尝试将datetime类似于epoch. 我想我也会把这个格式放在这里。 date -j -f "%Y-%m-%d %H:%M:%S" "2018-01-30 15:58:50" "+%s" 1517349530