Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Apr 2014 13:05:56 +0000 (UTC)
From:      Jean-Sebastien Pedron <dumbbell@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r264968 - head/bin/date
Message-ID:  <201404261305.s3QD5uRW042421@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dumbbell
Date: Sat Apr 26 13:05:56 2014
New Revision: 264968
URL: http://svnweb.freebsd.org/changeset/base/264968

Log:
  date(1): Add "-R" flag to use RFC 2822 date and time output format
  
  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.

Modified:
  head/bin/date/date.1
  head/bin/date/date.c

Modified: head/bin/date/date.1
==============================================================================
--- head/bin/date/date.1	Sat Apr 26 12:19:40 2014	(r264967)
+++ head/bin/date/date.1	Sat Apr 26 13:05:56 2014	(r264968)
@@ -40,7 +40,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
@@ -58,7 +58,7 @@
 .Ar MM Op Ar .ss
 .Sm on
 .Nm
-.Op Fl jnu
+.Op Fl jnRu
 .Fl f Ar input_fmt new_date
 .Op Cm + Ns Ar output_fmt
 .Nm
@@ -130,6 +130,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 ,

Modified: head/bin/date/date.c
==============================================================================
--- head/bin/date/date.c	Sat Apr 26 12:19:40 2014	(r264967)
+++ head/bin/date/date.c	Sat Apr 26 13:05:56 2014	(r264968)
@@ -69,12 +69,14 @@ static void setthetime(const char *, con
 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;
@@ -89,9 +91,9 @@ main(int argc, char *argv[])
 	(void) 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((char)ch) {
 		case 'd':		/* daylight savings time */
 			tz.tz_dsttime = strtol(optarg, &endptr, 10) ? 1 : 0;
@@ -108,6 +110,9 @@ main(int argc, char *argv[])
 		case 'n':		/* don't set network */
 			nflag = 1;
 			break;
+		case 'R':		/* RFC 2822 datetime format */
+			Rflag = 1;
+			break;
 		case 'r':		/* user specified seconds */
 			rflag = 1;
 			tval = strtoq(optarg, &tmp, 0);
@@ -145,6 +150,9 @@ main(int argc, char *argv[])
 
 	format = "%+";
 
+	if (Rflag)
+		format = rfc2822_format;
+
 	/* allow the operands in any order */
 	if (*argv && **argv == '+') {
 		format = *argv + 1;
@@ -169,6 +177,14 @@ 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");
+
 	(void)strftime(buf, sizeof(buf), format, &lt);
 	(void)printf("%s\n", buf);
 	if (fflush(stdout))
@@ -301,7 +317,7 @@ static void
 usage(void)
 {
 	(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]");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404261305.s3QD5uRW042421>