Message ID | 20240313175000.2148-1-dev+git@drbeat.li (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | date: make "iso-strict" conforming for the UTC timezone | expand |
"Beat Bolli" <bb@drbeat.li> writes: > ISO 8601-1:2020-12 specifies that a zero timezone offset must be denoted > with a "Z" suffix instead of the numeric "+00:00". Add the correponding > special case to show_date() and a new test. Hmph, would this break existing scripts that expects the current behaviour, and if it does, is it safe for us to blame the script authors for not following the standard? Assuming that we do not need to worry about them, the patch itself looks perfectly reasonable to me. Thanks. > Reported-by: Michael Osipov <michael.osipov@innomotics.com> > Link: https://lore.kernel.org/git/410d458c-ae5b-40cc-9c8e-97b016c74a76@siemens.com/ > Signed-off-by: Beat Bolli <dev+git@drbeat.li> > --- > date.c | 14 +++++++++----- > t/t0006-date.sh | 1 + > 2 files changed, 10 insertions(+), 5 deletions(-) > > diff --git a/date.c b/date.c > index 619ada5b2044..44cf2221d81f 100644 > --- a/date.c > +++ b/date.c > @@ -342,14 +342,18 @@ const char *show_date(timestamp_t time, int tz, const struct date_mode *mode) > tm->tm_hour, tm->tm_min, tm->tm_sec, > tz); > else if (mode->type == DATE_ISO8601_STRICT) { > - char sign = (tz >= 0) ? '+' : '-'; > - tz = abs(tz); > - strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", > + strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d", > tm->tm_year + 1900, > tm->tm_mon + 1, > tm->tm_mday, > - tm->tm_hour, tm->tm_min, tm->tm_sec, > - sign, tz / 100, tz % 100); > + tm->tm_hour, tm->tm_min, tm->tm_sec); > + if (tz == 0) { > + strbuf_addch(&timebuf, 'Z'); > + } else { > + strbuf_addch(&timebuf, tz >= 0 ? '+' : '-'); > + tz = abs(tz); > + strbuf_addf(&timebuf, "%02d:%02d", tz / 100, tz % 100); > + } > } else if (mode->type == DATE_RFC2822) > strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", > weekday_names[tm->tm_wday], tm->tm_mday, > diff --git a/t/t0006-date.sh b/t/t0006-date.sh > index e18b1602864e..1d228a981ee9 100755 > --- a/t/t0006-date.sh > +++ b/t/t0006-date.sh > @@ -46,6 +46,7 @@ check_show () { > TIME='1466000000 +0200' > check_show iso8601 "$TIME" '2016-06-15 16:13:20 +0200' > check_show iso8601-strict "$TIME" '2016-06-15T16:13:20+02:00' > +check_show iso8601-strict "$(echo "$TIME" | sed 's/+0200$/+0000/')" '2016-06-15T14:13:20Z' > check_show rfc2822 "$TIME" 'Wed, 15 Jun 2016 16:13:20 +0200' > check_show short "$TIME" '2016-06-15' > check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200'
On 2024-03-13 18:50, Beat Bolli wrote: > ISO 8601-1:2020-12 specifies that a zero timezone offset must be denoted > with a "Z" suffix instead of the numeric "+00:00". Add the correponding > special case to show_date() and a new test. Thanks for this lightspeed fix!
On 2024-03-13 19:30, Junio C Hamano wrote: > "Beat Bolli" <bb@drbeat.li> writes: > >> ISO 8601-1:2020-12 specifies that a zero timezone offset must be denoted >> with a "Z" suffix instead of the numeric "+00:00". Add the correponding >> special case to show_date() and a new test. > > Hmph, would this break existing scripts that expects the current > behaviour, and if it does, is it safe for us to blame the script > authors for not following the standard? From my PoV, if they don't stick it is not you to blame. The standard also says that it is equiv ("Z") to both numeral offsets. At the end strict is strict. Thanks, Michael
On Wed, Mar 13, 2024, at 18:50, Beat Bolli wrote: > Reported-by: Michael Osipov <michael.osipov@innomotics.com> > Link: https://lore.kernel.org/git/410d458c-ae5b-40cc-9c8e-97b016c74a76@siemens.com/ > Signed-off-by: Beat Bolli <dev+git@drbeat.li> I personally don’t really think `Link` trailers are necessary in this project given the existence of `refs/notes/amlog`.
diff --git a/date.c b/date.c index 619ada5b2044..44cf2221d81f 100644 --- a/date.c +++ b/date.c @@ -342,14 +342,18 @@ const char *show_date(timestamp_t time, int tz, const struct date_mode *mode) tm->tm_hour, tm->tm_min, tm->tm_sec, tz); else if (mode->type == DATE_ISO8601_STRICT) { - char sign = (tz >= 0) ? '+' : '-'; - tz = abs(tz); - strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", + strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec, - sign, tz / 100, tz % 100); + tm->tm_hour, tm->tm_min, tm->tm_sec); + if (tz == 0) { + strbuf_addch(&timebuf, 'Z'); + } else { + strbuf_addch(&timebuf, tz >= 0 ? '+' : '-'); + tz = abs(tz); + strbuf_addf(&timebuf, "%02d:%02d", tz / 100, tz % 100); + } } else if (mode->type == DATE_RFC2822) strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", weekday_names[tm->tm_wday], tm->tm_mday, diff --git a/t/t0006-date.sh b/t/t0006-date.sh index e18b1602864e..1d228a981ee9 100755 --- a/t/t0006-date.sh +++ b/t/t0006-date.sh @@ -46,6 +46,7 @@ check_show () { TIME='1466000000 +0200' check_show iso8601 "$TIME" '2016-06-15 16:13:20 +0200' check_show iso8601-strict "$TIME" '2016-06-15T16:13:20+02:00' +check_show iso8601-strict "$(echo "$TIME" | sed 's/+0200$/+0000/')" '2016-06-15T14:13:20Z' check_show rfc2822 "$TIME" 'Wed, 15 Jun 2016 16:13:20 +0200' check_show short "$TIME" '2016-06-15' check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200'
ISO 8601-1:2020-12 specifies that a zero timezone offset must be denoted with a "Z" suffix instead of the numeric "+00:00". Add the correponding special case to show_date() and a new test. Reported-by: Michael Osipov <michael.osipov@innomotics.com> Link: https://lore.kernel.org/git/410d458c-ae5b-40cc-9c8e-97b016c74a76@siemens.com/ Signed-off-by: Beat Bolli <dev+git@drbeat.li> --- date.c | 14 +++++++++----- t/t0006-date.sh | 1 + 2 files changed, 10 insertions(+), 5 deletions(-)