我需要像date
这样简单的东西,但是自1970年以来的秒数,而不是当前的日期,小时,分钟和秒。
date
似乎没有提供该选项。有一个简单的方法吗?
答案 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
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" "$@"