我需要一些简单的东西,比如日期,但从1970年开始以秒为单位,而不是当前的日期、小时、分钟和秒。

日期似乎没有提供这种选择。有一个简单的方法吗?


当前回答

对于大多数Awk实现:

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

其他回答

纯bash解决方案

自bash 5.0(2019年1月7日发布)以来,您可以使用内置变量EPOCHSECONDS。

$ echo $EPOCHSECONDS
1547624774

还有包括秒分数的EPOCHREALTIME。

$ echo $EPOCHREALTIME
1547624774.371210

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

$ echo ${EPOCHREALTIME/./}
1547624774371210

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

对于大多数Awk实现:

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

使用这个bash脚本(my~/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" "$@"

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

从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

没有外部程序和子外壳!

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

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

(但最好总是给出论点-1)。

如果使用-2而不是-1作为参数,Bash将使用shell启动的时间而不是当前日期。这可用于计算经过的时间

$ 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

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

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

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

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

要将时间戳转换回日期:

$ 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