I think that might give cause for confusion with respect to RFC3339 style string formatting, section 4.3: 4.3. Unknown Local Offset Convention If the time in UTC is known, but the offset to local time is unknown,
this can be represented with an offset of "-00:00". This differs semantically from an offset of "Z" or "+00:00", which imply that UTC is the preferred reference point for the specified time.
That's not what we intend to convey in this case, is it? I realize that the we're not trying to output RFC3339, but I think it could lead to confusion. Jon On 15 January 2017 at 08:48, Paul Eggert <eggert@cs.ucla.edu> wrote:
When the time zone has UT offset 0 and the time zone abbreviation begins with "-", the %z spec now expands to -0000 instead of to +0000. This conveys more-useful info, and is what the next version of GNU 'date' is intended to do. * NEWS, newstrftime.3: Document change. * date.1: Document %z. * strftime.c (_fmt): Implement change. --- NEWS | 4 ++++ date.1 | 1 + newstrftime.3 | 12 ++++++++++++ strftime.c | 13 ++++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/NEWS b/NEWS index 8276cc7..3975295 100644 --- a/NEWS +++ b/NEWS @@ -74,6 +74,10 @@ Unreleased, experimental changes when TZ is set to a POSIX-style string that specifies DST. (Problem reported by Kees Dekker.)
+ date and strftime now cause %z to generate "-0000" instead of + "+0000" when the UT offset is zero and the time zone abbreviation + begins with "-". + Changes to documentation and commentary
tz-link.htm now covers leap smearing, which is popular in clouds. diff --git a/date.1 b/date.1 index 7fd4848..579ab92 100644 --- a/date.1 +++ b/date.1 @@ -90,6 +90,7 @@ to be output in a particular way %X 14:54:40 Time* %y 89 Last two digits of year %Y 1989 Year in full +%z -0500 Numeric time zone %Z EST Time zone abbreviation %+ Wed Mar 8 14:54:40 EST 1989 Default output format* .if t .in -.5i diff --git a/newstrftime.3 b/newstrftime.3 index 9a60ee3..8f1be34 100644 --- a/newstrftime.3 +++ b/newstrftime.3 @@ -50,6 +50,13 @@ strftime \- format date and time .SH DESCRIPTION .ie '\(en'' .ds en \- .el .ds en \(en +.ie '\(lq'' .ds lq \&"\" +.el .ds lq \(lq\" +.ie '\(rq'' .ds rq \&"\" +.el .ds rq \(rq\" +.de q +\\$3\*(lq\\$1\*(rq\\$2 +.. The .I strftime function formats the information from @@ -211,6 +218,11 @@ is replaced by the offset from the Prime Meridian in the format +HHMM or \*-HHMM as appropriate, with positive values representing locations east of Greenwich, or by the empty string if this is not determinable. +The numeric time zone \*-0000 is used when the time is Universal Time +but local time is indeterminate; by convention this is used for +locations while uninhabited, and corresponds to a zero offset when the +time zone abbreviation begins with +.q "\*-" . .TP %% is replaced by a single %. diff --git a/strftime.c b/strftime.c index 984ead5..2bfb6c1 100644 --- a/strftime.c +++ b/strftime.c @@ -500,6 +500,7 @@ label: { long diff; char const * sign; + bool negative;
# ifdef TM_GMTOFF diff = t->TM_GMTOFF; @@ -538,7 +539,17 @@ label: continue; # endif # endif - if (diff < 0) { + negative = diff < 0; + if (diff == 0) { +#ifdef TM_ZONE + negative = t->TM_ZONE[0] == '-'; +#else + negative + = (t->tm_isdst < 0 + || tzname[t->tm_isdst != 0][0] == '-'); +#endif + } + if (negative) { sign = "-"; diff = -diff; } else sign = "+"; -- 2.7.4