2012-05-22 03:16:23 +00:00
|
|
|
#include <u.h>
|
|
|
|
#include <libc.h>
|
2020-06-14 22:12:57 +00:00
|
|
|
|
2020-08-11 02:02:09 +00:00
|
|
|
char *knownfmt[] = {
|
|
|
|
/* asctime */
|
|
|
|
"WW MMM DD hh:mm:ss ?Z YYYY",
|
|
|
|
/* RFC3339 */
|
|
|
|
"YYYY-MM-DD[T]hh:mm:ss[Z]?Z",
|
|
|
|
"YYYY-MM-DD[T]hh:mm:ss[Z]?Z",
|
|
|
|
"YYYY-MM-DD[T]hh:mm:ss ?Z",
|
|
|
|
"YYYY-MM-DD[T]hh:mm:ss?Z",
|
|
|
|
nil,
|
2020-06-14 22:12:57 +00:00
|
|
|
};
|
2020-06-14 02:47:22 +00:00
|
|
|
|
2020-08-11 02:02:09 +00:00
|
|
|
char *datefmt[] = {
|
|
|
|
/* RFC5322 */
|
|
|
|
"?W ?DD ?MMM ?YYYY",
|
|
|
|
"?W, DD-?MM-YY",
|
|
|
|
/* RFC822/RFC2822 */
|
|
|
|
"DD MMM YYYY",
|
|
|
|
"DD MMM YY",
|
|
|
|
/* RFC850 */
|
|
|
|
"WW, DD-MMM-YY",
|
|
|
|
/* RFC1123 */
|
|
|
|
"WWW, DD MMM YYYY",
|
|
|
|
/* RFC 3339 and human-readable variants */
|
|
|
|
"YYYY-MM-DD",
|
|
|
|
"YYYY-MM-DD [@] ",
|
|
|
|
/* random formats */
|
|
|
|
"?W ?MMM ?DD ?YYYY",
|
|
|
|
"?MMM ?DD ?YYYY",
|
|
|
|
"?DD ?MM ?YYYY",
|
|
|
|
"MMM ?DD ?YYYY",
|
|
|
|
"YYYY ?MM ?DD",
|
|
|
|
"YYYY ?DD ?MM",
|
|
|
|
"YYYY/MM?/DD?",
|
|
|
|
"MMM YYYY ?DD",
|
|
|
|
"?DD YYYY MMM",
|
|
|
|
"MM/DD/YYYY",
|
|
|
|
nil
|
|
|
|
};
|
2020-06-14 22:12:57 +00:00
|
|
|
|
2020-08-11 02:02:09 +00:00
|
|
|
char *timefmt[] = {
|
|
|
|
" hh:mm:ss",
|
|
|
|
" hh:mm",
|
|
|
|
" hh",
|
|
|
|
" hh:mm:ss ?A",
|
|
|
|
" hh:mm ?A",
|
|
|
|
" hh ?A",
|
|
|
|
"",
|
|
|
|
nil,
|
|
|
|
};
|
2020-06-14 22:12:57 +00:00
|
|
|
|
2020-08-11 02:02:09 +00:00
|
|
|
char *zonefmt[] = {
|
|
|
|
" ?Z",
|
|
|
|
"",
|
|
|
|
nil,
|
|
|
|
};
|
2020-06-14 22:12:57 +00:00
|
|
|
|
2012-05-22 03:16:23 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
usage(void)
|
|
|
|
{
|
2020-08-11 02:02:09 +00:00
|
|
|
fprint(2, "usage: %s [-f fmt] date-time/win m...\n", argv0);
|
2012-05-22 03:16:23 +00:00
|
|
|
exits("usage");
|
|
|
|
}
|
|
|
|
|
2020-08-11 02:02:09 +00:00
|
|
|
/*
|
|
|
|
* seconds absolute_date ... - convert absolute_date to seconds since epoch
|
|
|
|
*/
|
2012-05-22 03:16:23 +00:00
|
|
|
void
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
2020-08-11 02:02:09 +00:00
|
|
|
char **f, **df, **tf, **zf, *fmt, *ep, buf[256];
|
|
|
|
Tzone *tz;
|
|
|
|
Tm tm;
|
|
|
|
int i;
|
2012-05-22 03:16:23 +00:00
|
|
|
|
2020-08-11 02:02:09 +00:00
|
|
|
fmt = nil;
|
2012-05-22 03:16:23 +00:00
|
|
|
ARGBEGIN{
|
2020-08-11 02:02:09 +00:00
|
|
|
case 'f':
|
|
|
|
fmt = EARGF(usage());
|
|
|
|
break;
|
2012-05-22 03:16:23 +00:00
|
|
|
default:
|
|
|
|
usage();
|
2020-08-11 02:02:09 +00:00
|
|
|
}ARGEND;
|
|
|
|
|
|
|
|
if((tz = tzload("local")) == nil)
|
|
|
|
sysfatal("bad local time: %r");
|
|
|
|
for(i = 0; i < argc; i++){
|
|
|
|
if(fmt != nil){
|
|
|
|
if(tmparse(&tm, fmt, argv[i], tz, &ep) != nil && *ep == 0)
|
|
|
|
goto Found;
|
|
|
|
}else{
|
|
|
|
for(f = knownfmt; *f != nil; f++)
|
|
|
|
if(tmparse(&tm, *f, argv[i], tz, &ep) != nil && *ep == 0)
|
|
|
|
goto Found;
|
|
|
|
for(df = datefmt; *df; df++)
|
|
|
|
for(tf = timefmt; *tf; tf++)
|
|
|
|
for(zf = zonefmt; *zf; zf++){
|
|
|
|
snprint(buf, sizeof(buf), "%s%s%s", *df, *tf, *zf);
|
|
|
|
if(tmparse(&tm, buf, argv[i], tz, &ep) != nil && *ep == 0)
|
|
|
|
goto Found;
|
|
|
|
}
|
2012-05-22 03:16:23 +00:00
|
|
|
}
|
2020-08-11 02:02:09 +00:00
|
|
|
if(*ep == 0)
|
|
|
|
sysfatal("tmparse: %r");
|
2020-06-14 22:12:57 +00:00
|
|
|
else
|
2020-08-11 02:02:09 +00:00
|
|
|
sysfatal("tmparse: trailing junk");
|
|
|
|
Found:
|
|
|
|
print("%lld\n", tmnorm(&tm));
|
2020-06-14 22:12:57 +00:00
|
|
|
}
|
2020-08-11 02:02:09 +00:00
|
|
|
exits(nil);
|
2020-06-14 22:12:57 +00:00
|
|
|
}
|