如果你想获取未来的日期,为什么不能只获取当前日期并使用 sed/awk/etc 呢?

如果你想获取未来的日期,为什么不能只获取当前日期并使用 sed/awk/etc 呢?

我刚刚看了这个问题第一个答案说明如何直接从 date 命令获取未来日期。为什么不能只使用文本操作来增加日期?基本上:

date | # increment the time string by some amount here

我不熟悉awkor sedor 我会举一个更好的例子。

编辑:那么基本上没有技术原因吗?只是便携性以及它比看起来更难的事实?

答案1

你可以,但它会变得复杂。如果您有一个以简单秒为单位的日期,例如自 1970 年 1 月 1 日星期四午夜以来经过的秒数 (POSIX时间),添加一分钟相对容易:

$ date +%s
1379385111
$ date +%s | awk '{print "Current time is",$1,"soon will be", $1+60}'
Current time is 1379385275 soon will be 1379385335

很好,但是如果你想用人类可读的时间来做到这一点怎么办?如果你想增加 4 个月零 2 周怎么办?以秒为单位计算是一件痛苦的事,而且解释这样的日期也不容易。例如,什么日期411174000代表1

Sun 12 Dec 1936例如,您将如何增加3 周?如果不允许您使用日期操作库,这将是一个令人惊讶的棘手问题。考虑将所有日期转换为秒,然后相加,请记住,有些月份有 30 天,有些月份有 31 天,更不用说二月和闰年了。这确实不是一个小问题。这就是为什么大多数编程语言日期操作库(珀尔例如,或者C)。

最重要的是,date可以处理诸如tomorrowor 之类的日期 Oct 18 2017,并且可以对它们进行加法和减法并返回人类可读的日期而不是数字字符串。

既然标准date程序使这变得如此容易,为什么我们要重新发明轮子呢?

1今天是 1983 年欧洲中部时间 1 月 12 日星期三 00:00:00

答案2

除了经过深思熟虑的图书馆之外,使用任何其他东西来操纵时间和日期都是一个坏主意。看似微不足道的问题可能很快就会变成一个非常复杂的问题,例如夏令时、闰年、闰秒、时区等。

程序员不断地想,“哦,我只需做一两个快速函数就可以做到这一点”,并且您不必回顾最近发生的事件,苹果开发人员就是这么想的,并且没有正确处理该事件夏令时正确转换

摘抄

几个小时前,美国开始实行夏令时 (DST),当时时钟从凌晨 1:59 向前拨动至凌晨 3:00。

然而,一些 iPhone 用户报告了夏令时更改带来的各种问题。

TUAW 报告:

几位读者报告说,昨晚他们的 iPhone 时钟并没有像预期的那样快进一小时,而是朝错误的方向移动——向后一小时——因为自动时区调整出现了问题。纳什维尔的一位读者的手机认为他正处于山区时间;佛罗里达州手机上的一位读者确信时间应该是芝加哥时间。我们的同事梅尔·马丁住在亚利桑那州,那里基本上不遵守夏令时;然而,他的手机(已打开自动时区设置和位置设置)错误地向前跳了一小时。

底线

不要被问题表面上的简单性所诱惑,使用库!

答案3

基本上,你可以,但便携性不够,可能会失败,而且最终需要付出更多的努力。

假设我想用来awk将分钟数增加 3。(如果它大于 59,我将忽略它,我现在必须重置为 00):

$ date
Mon Sep 16 22:52:42 AST 2013
$ date | awk -F: '{printf $1 ":" ; printf $2+3 ":" ; print $3}'
Mon Sep 16 22:55:43 AST 2013

那里很好。但现在我必须开发一个功能,每当分钟达到 59 时,它就会重置为 00。不再好了。因此,首选自然方式来增加时间而不是解析文本。

相关内容