我昨天晚上(德国时间周日午夜之前)做了以下事情:
今天的日期
$ LC_TIME="en.GB.UTF8" date --iso-8601
2025-01-12
- 今天的日期(星期几
$ LC_TIME="en.GB.UTF8" date +%u
7
$ LC_TIME="en.GB.UTF8" date +%a
Sun
问题
- 由于一周从周一到周日开始,因此本周周一应该是 2025-01-06
$ LC_TIME="en_GB.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_IE.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_IN.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_US.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_DE.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_JP.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_DK.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_CA.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_AU.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
另一个观察
我今天(2025-01-13)做了这件事(在德国)
$ LC_TIME="en_AU.UTF-8" date -d "this-week-sunday" --iso-8601
2025-01-19
$ LC_TIME="en_AU.UTF-8" date -d "last-week-sunday" --iso-8601
2025-01-12
$ LC_TIME="en_AU.UTF-8" date -d "next-week-sunday" --iso-8601
2025-01-26
问题
因此,今天它似乎给出了部分正确的结果。今天的输出有什么问题:如果昨天的输出this-week-monday
是2025-01-13
这样的,计算机不知何故在每个地区都将星期日算作一周的第一天(我上面显示的)。所以"this-week-sunday"
应该是昨天而不是 2025-01-19(如今天所示)。
概括
昨天
$ LC_TIME="en_GB.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
今天
env -i bash --norc --noprofile
bash-5.2$ LC_TIME="en_AU.UTF-8" date -d "this-week-sunday" --iso-8601
2025-01-19
问题:如果昨天(2025-01-12,星期日)this-week-monday
是 13 号,那么今天this-week-sunday
应该是昨天而不是2025-01-19
为什么我得到错误的日期输出?
对于 的 GNU 实现
date
,请info date 'date input'
参阅输入格式的描述。相关的:
这里有一个相对日期格式,其中
this
是序数 0,week
一个乘数。因此,date -d 'this week monday'
这与date -d monday
将您带到下周一(或今天,如果今天是周一)相同this week
,因为它将时间移动了 0,因此没有任何效果。值得一提的是,它与 ast-open 的¹相同
date
(与 ksh93 的相同printf %T
)。在这里你可以这样做:
将当前时间向后移动一定天数,即当前星期几(1 表示星期一,7 表示星期日)减 1。
请注意,夏令时更改前后的午夜无法正常工作,因为一个时间
day
实际上意味着 86400 秒。例如,如果2024-10-27T23:30:00
在欧洲运行,则返回 2024-10-22,即星期二,因为 2024-10-27 实际上有 25 小时长,因为早上切换到冬令时。为了解决这个问题,最好是在中午进行计算(并且希望你所处的时区不是政府决定在那一周从 GMT+12 切换到 GMT-12 的时区)
或者切换到具有内置日期时间解析和格式化功能的 zsh,这可以避免 GNUisms。
¹ busybox
date
是另一种实现,您可以在其中输入特定日期,但不支持相对日期(尽管至少它支持使用 指定输入格式-D
,如 ast-open 的-p
)。BSD 具有用于指定输入日期的不同 API(并且取决于 BSD,-d
用于完全不相关的内容,而其他一些 API 添加了-d
与 GNU 兼容的 API)。