date(1): Add "-R" flag to use RFC 2822 date and time output format
authorRobin Hahling <robin.hahling@gw-computing.net>
Sat, 15 Nov 2014 18:57:37 +0000 (19:57 +0100)
committerFran├žois Tigeot <ftigeot@wolfpond.org>
Sat, 15 Nov 2014 19:01:48 +0000 (20:01 +0100)
As stated in the man page, this is equivalent to use
"%a, %d %b %Y %T %z" as the output format while LC_TIME is set to the
"C" locale.

This is compatible with date(1) from the GNU core utilities.

Taken-from: FreeBSD

While here, remove $DragonFly$ line from man page.

bin/date/date.1
bin/date/date.c

index dca72bf..979b1f6 100644 (file)
@@ -30,9 +30,8 @@
 .\"
 .\"     @(#)date.1     8.3 (Berkeley) 4/28/95
 .\" $FreeBSD: src/bin/date/date.1,v 1.72 2005/02/13 22:25:09 ru Exp $
-.\" $DragonFly: src/bin/date/date.1,v 1.4 2005/07/20 20:05:46 cpressey Exp $
 .\"
-.Dd August 9, 2004
+.Dd November 15, 2014
 .Dt DATE 1
 .Os
 .Sh NAME
@@ -40,7 +39,7 @@
 .Nd display or set date and time
 .Sh SYNOPSIS
 .Nm
-.Op Fl ju
+.Op Fl jRu
 .Op Fl r Ar seconds
 .Oo
 .Fl v
@@ -52,7 +51,7 @@
 .Ar ...
 .Op Cm + Ns Ar output_fmt
 .Nm
-.Op Fl jnu
+.Op Fl jnRu
 .Sm off
 .Op Oo Oo Oo Oo Ar cc Oc Ar yy Oc Ar mm Oc Ar dd Oc Ar HH
 .Ar MM Op Ar .ss
@@ -130,6 +129,16 @@ The
 .Fl n
 option suppresses this behavior and causes the time to be set only on the
 current machine.
+.It Fl R
+Use RFC 2822 date and time output format. This is equivalent to use
+.Dq Li %a, %d %b %Y \&%T %z
+as
+.Ar output_fmt
+while
+.Ev LC_TIME
+is set to the
+.Dq C
+locale.
 .It Fl r Ar seconds
 Print the date and time represented by
 .Ar seconds ,
index a0bb26a..7ab825e 100644 (file)
@@ -58,12 +58,14 @@ static void setthetime(const char *, const char *, int, int);
 static void badformat(void);
 static void usage(void);
 
+static const char *rfc2822_format ="%a, %d %b %Y %T %z";
+
 int
 main(int argc, char **argv)
 {
        struct timezone tz;
        int ch, rflag;
-       int jflag, nflag;
+       int jflag, nflag, Rflag;
        const char *format;
        char buf[1024];
        char *endptr, *fmt;
@@ -78,9 +80,9 @@ main(int argc, char **argv)
        setlocale(LC_TIME, "");
        tz.tz_dsttime = tz.tz_minuteswest = 0;
        rflag = 0;
-       jflag = nflag = 0;
+       jflag = nflag = Rflag = 0;
        set_timezone = 0;
-       while ((ch = getopt(argc, argv, "d:f:jnr:t:uv:")) != -1)
+       while ((ch = getopt(argc, argv, "d:f:jnRr:t:uv:")) != -1)
                switch(ch) {
                case 'd':               /* daylight savings time */
                        tz.tz_dsttime = strtol(optarg, &endptr, 10) ? 1 : 0;
@@ -97,6 +99,9 @@ main(int argc, char **argv)
                case 'n':               /* don't set network */
                        nflag = 1;
                        break;
+               case 'R':
+                       Rflag = 1;      /*RFC 2822 datetime format */
+                       break;
                case 'r':               /* user specified seconds */
                        rflag = 1;
                        tval = strtoll(optarg, &tmp, 0);
@@ -135,6 +140,9 @@ main(int argc, char **argv)
 
        format = "%+";
 
+       if (Rflag)
+               format = rfc2822_format;
+
        /* allow the operands in any order */
        if (*argv && **argv == '+') {
                format = *argv + 1;
@@ -159,6 +167,15 @@ main(int argc, char **argv)
                usage();
        }
        vary_destroy(v);
+
+       if (format == rfc2822_format) {
+               /*
+                * When using RFC 2822 datetime format, don't honor the
+                * locale.
+                */
+               setlocale(LC_TIME, "C");
+       }
+
        strftime(buf, sizeof(buf), format, &lt);
        printf("%s\n", buf);
        if (fflush(stdout) != 0)
@@ -289,7 +306,7 @@ static void
 usage(void)
 {
        fprintf(stderr, "%s\n%s\n",
-           "usage: date [-jnu] [-d dst] [-r seconds] [-t west] "
+           "usage: date [-jnRu] [-d dst] [-r seconds] [-t west] "
            "[-v[+|-]val[ymwdHMS]] ... ",
            "            "
            "[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]");