[tz] [PROPOSED] date +%z now outputs -0000 for uninhabited

Paul Eggert eggert at cs.ucla.edu
Sun Jan 15 08:48:50 UTC 2017


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



More information about the tz mailing list