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

Get current time in seconds since the Epoch on Linux, Bash

我需要一些简单的东西,比如date,但是从1970年开始,用秒来代替当前的日期、小时、分钟和秒。

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


这应该有效:

1
date +%s


只是补充一下。获取任意给定日期(例如1973年10月21日)的epoch(1970年1月1日)以来的秒数。

1
date -d"Oct 21 1973" +%s

将秒数转换回日期

1
date --date @120024000

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

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

更好的是,花点时间看一下手册页http://man7.org/linux/man-pages/man1/date.1.html


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

自bash 4.2以来,printf有了一个新的修饰语%(dateformat)T,当与参数-1一起使用时,输出当前日期,格式由dateformat给出,由strftime(3)处理(man 3 strftime获取格式信息)。

因此,对于纯bash解决方案:

1
2
printf '%(%s)T
'
-1

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

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

没有外部程序和子程序!

由于bash 4.3,甚至可能不指定-1

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

(不过,最好还是把这一论点用在第十一条〔六〕上)。

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


对于大多数awk实现:

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


这是对@pellucide所做工作的扩展,但对macs而言:

确定任何给定日期(例如1973年10月21日)自epoch(1970年1月1日)以来的秒数。

1
2
$ 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"。这可能不是你想要的。

要将时间戳转换回日期:

1
2
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

苹果的日期执行手册:https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/date.1.html网站


纯bash溶液

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

1
2
$ echo $EPOCHSECONDS
1547624774

还有EPOCHREALTIME,包括秒的分数。

1
2
$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIME可以通过删除小数点转换为微秒(μs)。当使用bash的内置算法(( expression ))时,这可能很有趣,因为它只能处理整数。

1
2
$ echo ${EPOCHREALTIME/./}
1547624774371215

在上面的所有示例中,打印的时间值都是相等的,以提高可读性。实际上,时间值会有所不同,因为执行每个命令需要很短的时间。


使用这个bash脚本(my ~/bin/epoch

1
2
3
4
5
6
7
8
9
#!/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""$@"