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:
parent
65493094e9
commit
b117583987
@ -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 ,
|
||||
|
@ -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, <);
|
||||
(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]");
|
||||
|
Loading…
Reference in New Issue
Block a user