日期命令给出了 12 月 31 日的错误周数

日期命令给出了 12 月 31 日的错误周数

当我尝试获取 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

答案1

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

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


ISO 周编号年份(非正式地也称为 ISO 年)有 52 或 53 个整周。即 364 或 371 天,而不是通常的 365 或 366 天。额外的一周有时被称为闰周,尽管 ISO 8601 不使用该术语。

每周从星期一开始。每年的每周都是周四所在的公历年。因此,一年中的第一周始终包含 1 月 4 日。因此,在 1 月 1 日附近的某些天,ISO 周年编号与公历略有不同。


如果您想将 12/31 显示为第 52 周,您应该使用%U,它不使用 ISO 标准:

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

答案2

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

对于欧洲,第 1 周包含 1 月的第一个周四,因此它包含至少 4 天(即大部分)属于新年(周四-周五-周六-周日)。

不管怎样,在这些年里,欧洲和美国之间所有(!!)周数都存在 +/- 1 的差异,这给跨国公司制定时间表带来了很大的乐趣。 :-)

相关内容