1

刚才(“Sun Jun 9 17:19:24 MDT 2013”​​),我运行了这个命令:

> date -d "first Sunday next month" 
Tue Jul  9 00:00:00 MDT 2013 

这既不是星期天,也不是下个月的第一个星期二:

  • date -d 如何解释我的输入?

  • 是否有一个详细的日期选项(甚至是“date -d”)来显示我的输入是如何被解释的?它不是-v,并且“man date”不显示详细选项。

  • 我意识到可能有一些库处理“date -d”。我在哪里可以找到该库及其文档、限制等?

  • 我意识到没有程序可以处理所有可能的格式,但是看到“date -d”给出错误的答案令人不安。对于错误的答案,我更喜欢“日期:无法解析'下个月的第一个星期日'”。

编辑:在 fedora 11 核心上运行它:

> date --version
date (GNU coreutils) 7.2
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
4

2 回答 2

1

GNU 日期选项:

-d, --date=string 显示字符串描述的时间,不是现在。它是一种人类可读的格式,例如“下周四”或“1 个月前”。日期字符串可以包含指示日历日期、时间、时区、星期几、相对时间、相对日期和数字的项目。这也称为相对 GNU 日期格式。[1] 以下是一些相对日期的示例:

date --date="1 days ago"
date --date="yesterday"
date --date='10 month ago'
date --date='2 hour ago'
date --date='Second Friday'

我直言不讳地从维基复制了这个。:http://en.wikipedia.org/wiki/Date_(Unix)

这个日期 -d 很愚蠢——给了我 7 月 16 日作为下个月的下一个第一个星期日

Kaizen ~ $ date -d "first Sunday next month"
+ date -d 'first Sunday next month'
Tue Jul 16 00:00:00 IST 2013

似乎该字符串的关键字是anded,然后给出结果......星期日+下个月......今天日期之后,即下个月(7月)的10日(6月)是7月16日。如果我在这里使用星期一而不是星期日,我会得到 7 月 17 日作为答案。

 Kaizen ~ $ date -d "next month monday"
 + date -d 'next month monday'
 Wed Jul 10 00:00:00 IST 2013

同样,如果我使用“下个月星期一”,那么它将转到下个月并从今天的日期开始寻找星期一,即结果是 10 日。

这有帮助吗?

此外,它超级不便携,并且在所有服务器上都无法正常工作……不了解您,但出于编程目的,我会远离它。

还有一个类似性质的超级用户问题:http://superuser.com/questions/572088/unix-date-command-not-working-for-few-servers你也可以检查一下

于 2013-06-10T02:26:16.063 回答
0
  • date -d 如何解释我的输入?

通过这个 Bison 语法,它是Gnulib的一部分,它date(实际上是 coreutils 包的大部分)依赖于它。我写语法的日子已经一去不复返了,但是“有趣”的相对日期/时间解析似乎从第 892 行开始。

  • 是否有一个详细的日期选项(甚至是“date -d”)来显示我的输入是如何被解释的?

在我写这篇文章时,当前版本的 GNU 日期(v8.28)确实有一个调试模式:

$ date --debug -d "first Sunday next month"
date: parsed day part: next/first Sun (day ordinal=1 number=0)
date: parsed relative part: +1 month(s)
date: input timezone: system default
date: warning: using midnight as starting time: 00:00:00
date: new start date: 'next/first Sun' is '(Y-M-D) 2019-02-03 00:00:00'
date: starting date/time: '(Y-M-D) 2019-02-03 00:00:00'
date: warning: when adding relative months/years, it is recommended to specify the 15th of the months
date: after date adjustment (+0 years, +1 months, +0 days),
date:     new date/time = '(Y-M-D) 2019-03-03 00:00:00'
date: '(Y-M-D) 2019-03-03 00:00:00' = 1551542400 epoch-seconds
date: timezone: system default
date: final: 1551542400.000000000 (epoch-seconds)
date: final: (Y-M-D) 2019-03-02 16:00:00 (UTC)
date: final: (Y-M-D) 2019-03-03 00:00:00 (UTC+08)
Sun Mar  3 00:00:00 +08 2019

如您所见,它是从左到右的;*“第一个星期日”向前解析到 2019 年 2 月的第一个星期日(2019-Feb-03),然后 *“下个月”增加一个月(2019-3-03),恰好也是星期日,因为它是不是闰年。

  • 我意识到可能有一些库处理“date -d”。我在哪里可以找到该库及其文档、限制等?

Gnulib,如上所述。此外,coreutils 手册的日期输入格式部分值得详细阅读。

  • 我意识到没有程序可以处理所有可能的格式,但是看到“date -d”给出错误的答案令人不安。对于错误的答案,我更喜欢“日期:无法解析'下个月的第一个星期日'”。

我相信parse_datetime例程的作者会同意。可悲的是,您的日期措辞似乎恰好与现有语法规则的某些分组相匹配,因此date尽职尽责地进行了必要的计算……并得出了错误的答案。

也许向 Gnulib 错误邮件列表 (bug-gnulib@gnu.org) 提交一份礼貌的错误报告可能会使一些齿轮转动。

哦,你可能已经想通了,但date -d "first Sunday"会得到正确的结果……只要你已经过了本月的第一个星期日。:)

于 2019-01-27T11:18:54.313 回答