Subject: bug#34608: closed (Re: bug#34608: date +%+4C is unimplemented, contrary to POSIX)

From: [email-masked] (GNU bug Tracking System)
Date: Mon, 25 Feb 2019 08:29:02 +0000

Your bug report

#34608: date +%+4C is unimplemented, contrary to POSIX

which was filed against the coreutils package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
34608: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=34608
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#34608: date +%+4C is unimplemented, contrary to POSIX
From: Paul Eggert <[email-masked]>
To: Eric Blake <[email-masked]>
Cc: [email-masked]
Date: Mon, 25 Feb 2019 00:27:47 -0800
List-Id: <debbugs-submit.debbugs.gnu.org>

Eric Blake wrote:

> The best I can do is search austingroupbugs.net for all bugs containing
> strftime, which pulls up a current total of 25 issues.

Thanks for doing that. I read through those issues, and the only one that seems 
relevant (i.e., resolved by austingroup but not in Gnulib) is the business with 
the + conversion specification flag. I installed this Gnulib patch to implement 
the flag:

https://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=188d87b05190690d6f8b0577ec65ef221a711d08

Then I installed the attached coreutils patches to propagate the Gnulib patch 
into coreutils, and I am marking this coreutils bug as done.

glibc strftime should also support the + conversion specification flag. I filed 
a bug report for that here:

https://sourceware.org/bugzilla/show_bug.cgi?id=24264
>From c50c4ab9e16df9368d52ed8cada3f3f2e32f093a Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Sun, 24 Feb 2019 23:35:23 -0800
Subject: [PATCH 1/3] build: update gnulib submodule to latest

---
 gnulib | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gnulib b/gnulib
index e3970fb98..188d87b05 160000
--- a/gnulib
+++ b/gnulib
@@ -1 +1 @@
-Subproject commit e3970fb9891668bd9dbc94daca18dc0d42b7e466
+Subproject commit 188d87b05190690d6f8b0577ec65ef221a711d08
-- 
2.17.1

>From b1e7af28ebc4b7218b2a76eee1dca738d3224a63 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Sun, 24 Feb 2019 23:59:22 -0800
Subject: [PATCH 2/3] =?UTF-8?q?date:=20=E2=80=98+=E2=80=99=20conversion=20?=
 =?UTF-8?q?specification=20flag?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The recent Gnulib update fixed Bug#34608; document and test this.
* NEWS: Mention the change.
* doc/coreutils.texi (Padding and other flags):
Update doc to cover new flag and other POSIX.1-2017 changes.
* tests/misc/date.pl (date-century-plus): New test.
---
 NEWS               |  3 +++
 doc/coreutils.texi | 15 ++++++++++++---
 tests/misc/date.pl |  3 +++
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/NEWS b/NEWS
index 5d9956854..e73cb52b8 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,9 @@ GNU coreutils NEWS                                    -*- outline -*-
   after asking the user whether to proceed.
   [This bug was present in "the beginning".]
 
+  'date' now supports the '+' conversion specification flag,
+  introduced in POSIX.1-2017.
+
   df no longer corrupts displayed multibyte characters on macOS.
   [bug introduced with coreutils-8.18]
 
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 028371673..d1427323c 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -15985,24 +15985,33 @@ example, numeric months are always output as two digits.
 Seconds since the epoch are not padded, though,
 since there is no natural width for them.
 
-As a GNU extension, @command{date} recognizes any of the
-following optional flags after the @samp{%}:
+The following optional flags can appear after the @samp{%}:
 
 @table @samp
 @item -
 (hyphen) Do not pad the field; useful if the output is intended for
 human consumption.
+This is a GNU extension.
 @item _
 (underscore) Pad with spaces; useful if you need a fixed
 number of characters in the output, but zeros are too distracting.
+This is a GNU extension.
 @item 0
 (zero) Pad with zeros even if the conversion specifier
 would normally pad with spaces.
+@item +
+Pad with zeros, like @samp{0}.  In addition, precede any year number
+with @samp{+} if it exceeds 9999 or if its field width exceeds 4;
+similarly, precede any century number with @samp{+} if it exceeds 99
+or if its field width exceeds 2.  Preceding with @samp{+} is helpful
+for generationg some ISO 8601 formats.
 @item ^
 Use upper case characters if possible.
+This is a GNU extension.
 @item #
 Use opposite case characters if possible.
 A field that is normally upper case becomes lower case, and vice versa.
+This is a GNU extension.
 @end table
 
 @noindent
@@ -16017,7 +16026,7 @@ date +%_d/%_m -d "Feb 1"
 @result{}  1/ 2
 @end example
 
-As a GNU extension, you can specify the field width
+You can optionally specify the field width
 (after any flag, if present) as a decimal number.  If the natural size of the
 output of the field has less than the specified number of characters,
 the result is written right adjusted and padded to the given
diff --git a/tests/misc/date.pl b/tests/misc/date.pl
index 5e12158e9..9ba3d3983 100755
--- a/tests/misc/date.pl
+++ b/tests/misc/date.pl
@@ -297,6 +297,9 @@ my @Tests =
       {ENV => 'TZ=PST8'},
       {OUT => 'Wed Dec 31 21:00:00 PST 1969'},
      ],
+
+     # https://bugs.gnu.org/34608
+     ['date-century-plus', '-d @0 +.%+4C.', {OUT => '.+019.'}],
     );
 
 # Repeat the cross-dst test, using Jan 1, 2005 and every interval from 1..364.
-- 
2.17.1

>From 3e7fd6650e6040c6b09f97d6f189e0365727df90 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Mon, 25 Feb 2019 00:19:22 -0800
Subject: [PATCH 3/3] doc: fix typo in previous patch

---
 doc/coreutils.texi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index d1427323c..886ecf451 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -16004,7 +16004,7 @@ Pad with zeros, like @samp{0}.  In addition, precede any year number
 with @samp{+} if it exceeds 9999 or if its field width exceeds 4;
 similarly, precede any century number with @samp{+} if it exceeds 99
 or if its field width exceeds 2.  Preceding with @samp{+} is helpful
-for generationg some ISO 8601 formats.
+for generating some ISO 8601 formats.
 @item ^
 Use upper case characters if possible.
 This is a GNU extension.
-- 
2.17.1

Subject: date +%+4C is unimplemented, contrary to POSIX
From: Eric Blake <[email-masked]>
To: [email-masked]
Date: Thu, 21 Feb 2019 11:10:06 -0600
List-Id: <debbugs-submit.debbugs.gnu.org>

POSIX requires the '+' flag in %C to output padding with leading 0, and
additionally to add a +/- indicator if the minimum field width is larger
than 2 bytes.  Thus:

date -d 0001-01-01 +.%+4C.

should produce ".+000.", but currently it produces ".%+4C." because the
+ flag is unimplemented.

See also http://austingroupbugs.net/view.php?id=1184

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org