2011-03-30 12:46:40 +00:00
|
|
|
#include <u.h>
|
|
|
|
#include <libc.h>
|
|
|
|
|
2020-08-11 02:01:45 +00:00
|
|
|
enum {
|
|
|
|
Nsec = 1000*1000*1000,
|
2019-09-06 15:25:21 +00:00
|
|
|
};
|
|
|
|
|
2020-08-11 02:01:45 +00:00
|
|
|
void
|
|
|
|
usage(void)
|
2019-09-06 15:25:21 +00:00
|
|
|
{
|
2020-08-11 02:01:45 +00:00
|
|
|
fprint(2, "usage: date [-itunm] [-f fmt] [seconds]\n");
|
|
|
|
exits("usage");
|
2019-09-06 15:25:21 +00:00
|
|
|
}
|
|
|
|
|
2011-03-30 12:46:40 +00:00
|
|
|
void
|
|
|
|
main(int argc, char *argv[])
|
|
|
|
{
|
2020-08-11 02:01:45 +00:00
|
|
|
int nflg, uflg;
|
|
|
|
char *fmt;
|
|
|
|
vlong s, ns;
|
|
|
|
Tzone *tz;
|
|
|
|
Tm tm;
|
|
|
|
|
|
|
|
nflg = 0;
|
|
|
|
uflg = 0;
|
|
|
|
tz = nil;
|
|
|
|
fmt = "WW MMM _D hh:mm:ss ZZZ YYYY";
|
|
|
|
tmfmtinstall();
|
|
|
|
|
2011-03-30 12:46:40 +00:00
|
|
|
ARGBEGIN{
|
2020-08-11 02:01:45 +00:00
|
|
|
case 'n': nflg = 1; break;
|
|
|
|
case 'u': uflg = 1; break;
|
|
|
|
case 't': fmt = "YYYY-MM-DDThh:mm:ssZZ"; break;
|
|
|
|
case 'i': fmt = "YYYY-MM-DD"; break;
|
|
|
|
case 'f': fmt = EARGF(usage()); break;
|
|
|
|
default: usage();
|
2011-03-30 12:46:40 +00:00
|
|
|
}ARGEND
|
|
|
|
|
2020-08-11 02:01:45 +00:00
|
|
|
s = 0;
|
|
|
|
ns = 0;
|
|
|
|
switch(argc) {
|
|
|
|
case 0:
|
|
|
|
ns = nsec();
|
|
|
|
s = ns/Nsec;
|
|
|
|
ns = ns%Nsec;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
s = strtoll(argv[0], nil, 0);
|
|
|
|
ns = 0;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
usage();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!uflg && (tz = tzload("local")) == nil)
|
|
|
|
sysfatal("timezone: %r");
|
|
|
|
if(tmtimens(&tm, s, ns, tz) == nil)
|
|
|
|
sysfatal("now: %r");
|
2011-03-30 12:46:40 +00:00
|
|
|
|
|
|
|
if(nflg)
|
2020-08-11 02:01:45 +00:00
|
|
|
print("%lld\n", tmnorm(&tm));
|
|
|
|
else
|
|
|
|
if(print("%τ\n", tmfmt(&tm, fmt)) == -1)
|
|
|
|
sysfatal("%r");
|
2011-03-30 12:46:40 +00:00
|
|
|
exits(0);
|
|
|
|
}
|