日期命令给12月31日提供了错误的星期数


21

当我尝试获取12月31日的星期数时,它返回1。当我获取12月30日的星期数时,我得到52 ---这是我期望的。星期一是正确的一天。这是在运行Ubuntu的RPI上。

$ date -d "2018-12-30T1:58:55" +"%V%a"

52Sun

$ date -d "2018-12-31T1:58:55" +"%V%a"

01Mon

没有时间字符串的相同问题

$ date -d "2018-12-31" +"%V%a"

01Mon

9
“日期命令给出了12月31日的星期几有误” –根据哪个规范是“错误的”?您使用的规范是否与手册中所使用的规范相同date
约尔格W¯¯米塔格


2
您可能对为什么MonthCalendar控件在罗马尼亚显示错误的周数感兴趣该博客文章是有关Windows的,但是讨论的问题是普遍的(似乎与您遇到的问题相同)。
CVn

1
“计算机一定是错误的,因为我显然没有弄错!” 让我想起当我抱怨FORTRAN IV编译器必须有一个错误,因为我的第一个简单程序不可能有任何错误...
RonJohn

Answers:


49

这为您提供了从星期一开始的ISO周。

ISO周日期系统实际上是a周日历系统,它是国际标准化组织(ISO)自1988年以来发布的ISO 8601日期和时间标准的一部分(最近一次于2004年修订),在此之前已在自1971年以来一直为ISO(R)2015。它主要用于政府和企业的会计年度,以及计时。这以前称为“工业日期编码”。系统通过定义年份的序数周的表示法在公历上指定一周的年份。


一个ISO周编号年份(也非正式地称为ISO年)有52或53个完整周。那是364或371天,而不是通常的365或366天。多余的一周有时称为a周,尽管ISO 8601并未使用该术语。

每周从星期一开始。每周的年份是星期四的公历年。因此,一年的第一周始终包含1月4日。因此,在接近1月1日的几天中,ISO周年编号与公历略有偏离。


如果要在第52周显示12/31,则应使用%U,而不使用ISO标准:

$ date -d "2018-12-31T1:58:55" +"%V%a"
01Mon
$ date -d "2018-12-31T1:58:55" +"%U%a"
52Mon

谢谢。那就是我想要的。我在cal命令中使用了更为复杂的方法。
乔治·谢弗

3

欧洲和美国之间周数的定义不同,可能是ISO和ANSI标准。这可能与一周中的星期天-星期六或星期一-周日有关,这又可能与犹太人对基督教徒对主日的定义有关(安息日与星期日)。

对于欧洲,第1周包含一月的第一个星期四,因此它包含至少4天(即大多数)属于新年(Thu-Fri-Sat-Sun)。

无论如何,在这样的年份中,欧洲和美国之间的所有(!!)周数字都相差+/- 1,这给在跨国公司中设定时间表带来了极大的乐趣。:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.