'date -d'如何解析日期?

时间:2013-06-09 23:28:21

标签: unix date

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

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

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

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

  • 是否有显示日期(甚至“日期-d”)的详细选项 我的输入是如何解释的?它不是-v,而“人约会”却没有 显示一个冗长的选项。

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

  • 我意识到没有程序可以处理所有可能的格式,但它是 看到“日期-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.

2 个答案:

答案 0 :(得分:2)

GNU日期选项:

-d, - date =字符串显示时间由字符串描述,而不是现在。它是一种人类可读的格式,例如“下周四”或“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

似乎该字符串有关键字,然后给出结果......星期日+下个月......在今天日期之后,即下个月(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你也可以检查出来

答案 1 :(得分:1)

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

this Bison grammar的一部分是Gnulibdate(实际上是coreutils软件包的大部分)依赖于此。我写语法的日子早已一去不复返了,但是相对日期/时间解析“ fun”似乎始于line 892

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

我编写此(v8.28) 时,GNU日期的当前版本具有调试模式:

$ 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年2月3日),然后 *“下个月”增加了一个月(2019年3月3日),这恰好也是星期日,因为它不是a年。

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

Gnulib,如上所述。另外,值得详细阅读coreutils手册的Date input formats部分。

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

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

也许向Gnulib错误邮件列表(bug-gnulib@gnu.org)礼貌地报告错误可能会导致一些麻烦。

哦,您可能已经弄清楚了,但是date -d "first Sunday"会给您正确的结果……只要您超过了本月的第一个星期日。 :)