获取自Linux,Bash上的纪元以来的当前时间(以秒为单位)


633

我需要类似的简单内容date,但是需要自1970年以来的秒数,而不是当前日期,小时,分钟和秒。

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


22
抱歉,我必须这样说……。“日期似乎不提供该选项。有什么简单的方法吗?''-再次阅读手册;-)
TheBonsai

7
日期的某些版本有日期,有些则没有。因此,它并不总是存在。我运行了'type -a date'并使用了一个不同的版本,那行得通。
Scott Rowley 2014年

1
FWIW,Ubuntu仅具有/ bin / date,@ Steef的答案适用于此-Jonathan
Hartley

1
@TheBonsai不属于“日期”工具的POSIX标准版本。仅仅因为您的版本具有它(可能是GNU),您就不应假定每个人的实现都可以。
Wyatt8740

Answers:


1159

这应该工作:

date +%s

45
日期空档应该从更改为%s seconds since 1970-01-01 00:00:00 UTC%s seconds since the epoch, 1970-01-01 00:00:00 UTC因为我在那里错过了。
devin

3
对我不起作用。人工日期不显示%s。我必须有一个非常旧的bash版本(对于Solaris是3.2.51(1))?
livefree75年

7
@ livefree75 date没有内置bash,因此您的版本bashdate系统附带的实现无关。
2014年

11
如果您想将一秒的小数位保留到小数点后九位,请使用:date +%s.%N
Jonathan Hartley

19
使用毫秒date +%s%3N
Juan Campa

133

只是添加。

获取从纪元(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


这不是OP的问题,但它回答了我的问题,因此向我+1。
AnthonyD973 '19

也许它是的版本,date或者因为我正在使用zsh(macOS Catalina),但这对我不起作用。运行$ date -d "Oct 21 1973" +%s输出usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
约书亚·品特

43

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

从Bash 4.2开始,printf具有一个新的修饰符%(dateformat)T,当与参数一起使用时,其-1输出的日期为,格式为dateformat,由strftime(3)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将使用启动外壳程序的时间而不是当前日期。这可以用来计算经过时间

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422

9
你想用-2的情况下,你有一个较长的运行工作(想想一个脚本来控制你的备份),并在结束时发送邮件“备份开始在$在$现在somewhen完成” -这可以实现-2避免存储开始时是专用变量。
塞巴斯蒂安·J.

23

对于大多数Awk实现:

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

21
令人费解的哇
ericslaw

8
哇,不得不去看看这个。这是一个务实的解决方案,但不一定是好的/便携式的。似乎awk的实现srand()通常以当前日期/时间作为种子。第二次调用srand()返回以前用作种子的值。
Ryan Ransford

23

纯bash解决方案

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

$ echo $EPOCHSECONDS
1547624774

也有 EPOCHREALTIME包括几分之一秒。

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIME可以通过删除小数点将其转换为微秒(μs)。使用bash的内置算法时,可能会对此感兴趣(( expression ))只能处理整数。

$ echo ${EPOCHREALTIME/./}
1547624774371215

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


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

19

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

确定自某个时期(1970年1月1日)以来的秒数(例如1973年10月21日)

$ 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


1
需要明确的是,这是针对BSD的date命令,而任何建议date -d的解决方案都是针对GNU的date。macOS中的BSD日期来自FreeBSD,并且与NetBSD和OpenBSD共享许多选项。这与bash 完全分开
ghoti

%NMacOS日期缺少gnu日期中提到的小数秒的选项。在10.14版中,手册页中没有任何格式。它们在strftime(3)手册页中,如果您没有安装Xcode,则不会在手册页中显示,即使您执行了man命令也可能看不到。
丹·普里兹

1

使用以下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" "$@"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.