获取自Linux上的Epoch以来的当前时间,Bash

n-a*_*der 574 linux bash datetime

我需要一些简单的东西date,但是自1970年以来的几秒钟而不是当前的日期,小时,分钟和秒.

date似乎没有提供这种选择.有一个简单的方法吗?

Ste*_*eef 1055

这应该工作:

date +%s
Run Code Online (Sandbox Code Playgroud)

  • 日期manpge应该从1970-01-01 00:00:00 UTC后的%s秒变为自纪元以来的%s秒,1970-01-01 00:00:00 UTC`因为我错过了那里. (38认同)
  • 如果你想要一秒的分数,到九位小数,请使用:`date +%s.%N` (10认同)
  • 以毫秒为单位,请使用“日期+%s%3N” (7认同)
  • @ livefree75`date`没有构建到`bash`中,所以你的`bash`版本与你的系统附带的`date`实现无关. (6认同)
  • 对我不起作用.男人约会不显示%s.我必须有一个非常旧版本的bash(Solaris的3.2.51(1))? (3认同)

pel*_*ide 120

只是补充一下.

获取自纪元(1970年1月1日)以来任何特定日期(例如1973年10月21日)的秒数.

date -d "Oct 21 1973" +%s
Run Code Online (Sandbox Code Playgroud)


将秒数转换回日期

date --date @120024000
Run Code Online (Sandbox Code Playgroud)


该命令date非常通用.你可以用日期做的另一件很酷的事情(无耻地复制date --help).显示下周五上午9点在美国西海岸的当地时间

date --date='TZ="America/Los_Angeles" 09:00 next Fri'
Run Code Online (Sandbox Code Playgroud)

更好的是,花些时间阅读手册页 http://man7.org/linux/man-pages/man1/date.1.html

  • 这不是OP的问题,但它回答了我的问题,所以我+1。 (2认同)
  • 上面的“date”命令来自 **gnu coreutils** pacakge。在 Mac 上,**gnu coreutils** 软件包可以使用 [brew](https://brew.sh) 或 [macports](https://www.macports.org/) 安装。安装后,二进制文件被命名为“gdate”,以区别于 macOS 预装的“/bin/date” (2认同)
  • @JoshuaPinter 使用 ```date -r 120024000``` (2认同)

gni*_*urf 38

到目前为止,所有答案都使用外部程序date.

从Bash 4.2开始,printf有一个新的修饰符%(dateformat)T,当与参数一起使用时,-1输出当前日期,格式由给定dateformat,处理strftime(3)(man 3 strftime有关格式的信息).

那么,对于纯粹的Bash解决方案:

printf '%(%s)T\n' -1
Run Code Online (Sandbox Code Playgroud)

或者如果您需要将结果存储在变量中var:

printf -v var '%(%s)T' -1
Run Code Online (Sandbox Code Playgroud)

没有外部程序,没有子shell!

从Bash 4.3开始,甚至可以不指定-1:

printf -v var '%(%s)T'
Run Code Online (Sandbox Code Playgroud)

(但总是尽可能地提出论点可能更明智-1).

如果您使用-2as作为参数而不是-1,Bash将使用shell的启动时间而不是当前日期(但为什么要这样?).

  • 你想使用`-2`以防你有一个更长的运行工作(想想一个脚本来控制你的备份)并最后发送邮件"备份开始于$ somewhen在$ now完成现在" - 这可以通过`-2`避免在开头存储专用变量. (7认同)

小智 20

大多数Awk实现:

awk 'BEGIN {srand(); print srand()}'
Run Code Online (Sandbox Code Playgroud)

  • 哇哇哇哇 (19认同)
  • 哇,不得不去看看这个.这是一个实用的解决方案,但不一定好/便携.[似乎awk`srand()`](https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html)的实现通常以当前日期/时间播种.第二次调用`srand()`返回以前用作种子的值. (7认同)
  • 我建议 awk 'BEGIN {print srand(srand())}' 是错误的吗 (4认同)

Peq*_*qNP 17

这是@pellucide所做的扩展,但对于Macs:

确定自纪元(1970年1月1日)以来任何特定日期(例如1973年10月21日)的秒数

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
Run Code Online (Sandbox Code Playgroud)

请注意,为了完整起见,我已将时间部分添加到格式中.原因是,您date将采用您提供的任何日期部分,并将当前时间添加到提供的值.例如,如果您在下午4:19执行上述命令,而没有'00:00:00'部分,它将自动添加时间.这样"1973年10月21日"将被解析为"1973年10月21日16:19:00".这可能不是你想要的.

要将时间戳转换回日期:

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
Run Code Online (Sandbox Code Playgroud)

Apple的日期实现手册页:https: //developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

  • 需要明确的是,这是针对 BSD 的 `date` 命令,而任何建议使用 `date -d` 的解决方案都是针对 GNU `date`。macOS 中的 BSD 日期 [来自 FreeBSD](https://man.freebsd.org/date),并与 NetBSD 和 OpenBSD 共享许多选项。这是 *** 与 bash 完全分开的***。 (2认同)

Soc*_*owi 13

纯bash解决方案

bash5.0(2019年1月7日发布)开始,您可以使用内置变量EPOCHSECONDS

$ echo $EPOCHSECONDS
1547624774
Run Code Online (Sandbox Code Playgroud)

EPOCHREALTIME包括几分之一秒。

$ echo $EPOCHREALTIME
1547624774.371215
Run Code Online (Sandbox Code Playgroud)

EPOCHREALTIME可以通过删除小数点将其转换为微秒(?s)。当使用只能处理整数bash的内置算法时,这可能会引起人们的兴趣(( expression ))

$ echo ${EPOCHREALTIME/./}
1547624774371215
Run Code Online (Sandbox Code Playgroud)

在上面的所有示例中,打印时间值均相等,以提高可读性。实际上,时间值会有所不同,因为每个命令需要花费少量时间来执行。

  • 对于毫秒分辨率(与“date +%s%3N”格式相同),您可以使用“echo $(( ${EPOCHREALTIME/./} / 1000 ))” (4认同)