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.
This commit is contained in:
Jean-Sébastien Pédron 2014-04-26 13:05:56 +00:00
parent 612032773a
commit b69ced8d8c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=264968
2 changed files with 32 additions and 6 deletions

View File

@ -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 ,

View File

@ -69,12 +69,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;
@ -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]");