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

时间:2009-07-07 14:22:31

标签: linux bash datetime

我需要像date这样简单的东西,但是自1970年以来的秒数,而不是当前的日期,小时,分钟和秒。

date似乎没有提供该选项。有一个简单的方法吗?

7 个答案:

答案 0 :(得分:959)

这应该有效:

date +%s

答案 1 :(得分:112)

添加。

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

date -d "Oct 21 1973" +%s


 将秒数转换回日期

date --date @120024000


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

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

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

答案 2 :(得分:32)

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

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

所以,对于纯粹的Bash解决方案:

printf '%(%s)T\n' -1

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

printf -v var '%(%s)T' -1

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

自Bash 4.3以来,甚至可以不指定-1

printf -v var '%(%s)T'

(尽管如此,总是给出论据-1可能更明智。)

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

答案 3 :(得分:17)

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

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

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

请注意,为了完整起见,我已将时间部分添加到格式中。原因是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

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

答案 4 :(得分:17)

大多数Awk实施:

awk 'BEGIN {srand(); print srand()}'

答案 5 :(得分:7)

纯bash解决方案

bash 5.0(released on 7 Jan 2019开始,您可以使用内置变量EPOCHSECONDS

$ echo $EPOCHSECONDS
1547624774

还有EPOCHREALTIME,其中包括几分之一秒。

$ echo $EPOCHREALTIME
1547624774.371215
通过删除小数点,可以将

EPOCHREALTIME转换为微秒(μs)。当使用bash的内置算术(( expression ))(只能处理整数)时,可能会对此感兴趣。

$ echo ${EPOCHREALTIME/./}
1547624774371215

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

答案 6 :(得分:0)

使用此bash脚本(我的~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"