commit c018f86fc752e1f1743985852993bfa755c637bd
parent 3863ccdf98c8a4b26748ab23d71f8a2576ae6672
Author: Robert Ransom <rransom.8774@gmail.com>
Date:   Mon, 23 Apr 2012 08:32:24 -0700
Add -u option to date (POSIX and Plan 9, and useful)
Diffstat:
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/date.1 b/date.1
@@ -5,6 +5,7 @@ date \- print date and time
 .B date
 .RB [ \-d
 .IR time ]
+.RB [ \-u ]
 .RI [+ format ]
 .SH DESCRIPTION
 .B date
@@ -18,5 +19,8 @@ is given it is used to format the date as per
 prints
 .I time
 instead of the system time, given as the number of seconds since the Unix epoch.
+.TP
+.B \-u
+prints UTC time instead of local time.
 .SH SEE ALSO
 .IR strftime (3)
diff --git a/date.c b/date.c
@@ -11,21 +11,27 @@ main(int argc, char *argv[])
 	char buf[BUFSIZ], c;
 	char *fmt = "%c";
 	struct tm *now = NULL;
+	struct tm *(*tztime)(const time_t *) = localtime;
+	const char *tz = "local";
 	time_t t;
 
 	t = time(NULL);
-	while((c = getopt(argc, argv, "d:")) != -1)
+	while((c = getopt(argc, argv, "d:u")) != -1)
 		switch(c) {
 		case 'd':
 			t = estrtol(optarg, 0);
 			break;
+		case 'u':
+			tztime = gmtime;
+			tz = "gm";
+			break;
 		default:
 			exit(EXIT_FAILURE);
 		}
 	if(optind < argc && argv[optind][0] == '+')
 		fmt = &argv[optind][1];
-	if(!(now = localtime(&t)))
-		eprintf("localtime failed\n");
+	if(!(now = tztime(&t)))
+		eprintf("%stime failed\n", tz);
 
 	strftime(buf, sizeof buf, fmt, now);
 	puts(buf);