将任意开始日期经过的秒数转换为日期

将任意开始日期经过的秒数转换为日期

我想将特定的秒数转换为日期。就我而言,它是自 0001 年 1 月 1 日以来经过的秒数。

如果从纪元开始已经过去了几秒,那就很容易了:$ date -r nr_of_seconds。如果有一种方法可以告诉date您在特定日期开始,那就太棒了。是否有这样的选项(该-v选项几乎满足我的需要,......我认为)?

我在 Mac 上。

答案1

date -r几乎完成了这项工作。您所需要做的就是移动原点,这是一个加法。

date -r $((number_of_seconds - epoch))

其中epoch是 1970 年 1 月 1 日到 1 月 1 日之间的秒数。 的值epoch取决于您的日历。

在公历中,1 到 1970 之间有 477 个闰年,因此 365 * 1969 + 477 = 719162 天 = 62135596800 秒。请注意,这个数字大于 2 32,因此您需要一个能够执行 64 位算术的 shell 来处理它。如果它代表的日期超出了公元二世纪,那么无论如何,您number_of_seconds将超过 2 32 。我认为 bash 即使在较旧的 32 位 OSX 上也支持 64 位算术,但我不确定。

date -r $((number_of_seconds - 62135596800))

答案2

你可以使用这个:

echo $(( `date +%s` - ` date --date=yesterday +%s ` ))
86400

您可以用任何日期替换“昨天”。例如:

echo $(( `date +%s` - ` date --date='Tue Aug 9 11:44:34 CEST 2014' +%s ` ))
259209

在 GNU/Linux 上测试。

答案3

问题在于,并非所有人都同意 1923 年之前的日期。我们(西方人)现在使用的是公历。 1582年之前,人们使用儒略历。 1582 年至 1923 年间,有些人使用其中之一。

例如,英国于 1752 年切换到公历,这就是该cal命令使用的切换点。查看 的输出cal 9 1752

因此,如果您找到一份提及 1654 年 11 月 3 日旧英文文档,则该日期不一定与法文文档中提及的 1654 年 11 月3相同。当时的法国人和英国人都同意 0001-01-01 是什么日期(例如那天发生的事情),但这并不是 GNUdate认为的日期。

我曾经编写过一些 POSIX shell 函数,使用相同的日历开关cal并忽略闰秒来进行任意日期计算。您可以在以下位置找到它:https://github.com/stephane-chazelas/misc-scripts/blob/master/wide_strftime.sh

例如,要了解 0001-01-01 00:00:00 GMT Julian Calendar 之后 10G 秒的日期(假设每天 86400 秒,因此并非所有秒都持续相同的时间):

$ timegm 1 1 1 0 0 0
$ wide_strftime "%c" "$((REPLY + 10000000000))"
echo "$REPLY"
$ echo "$REPLY"
Mon Nov 18 17:46:40 0317

相关内容