date: add "unix" format

We already have "--date=raw", which is a Unix epoch
timestamp plus a contextual timezone (either the author's or
the local). But one may not care about the timezone and just
want the epoch timestamp by itself. It's not hard to parse
the two apart, but if you are using a pretty-print format,
you may want git to show the "finished" form that the user
will see.

We can accomodate this by adding a new date format, "unix",
which is basically "raw" without the timezone.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King
2016-07-22 15:51:49 -04:00
committed by Junio C Hamano
parent 1a2a1e8eb9
commit 642833db78
5 changed files with 19 additions and 1 deletions

View File

@ -751,6 +751,10 @@ Note that the `-local` option does not affect the seconds-since-epoch
value (which is always measured in UTC), but does switch the accompanying value (which is always measured in UTC), but does switch the accompanying
timezone value. timezone value.
+ +
`--date=unix` shows the date as a Unix epoch timestamp (seconds since
1970). As with `--raw`, this is always in UTC and therefore `-local`
has no effect.
+
`--date=format:...` feeds the format `...` to your system `strftime`. `--date=format:...` feeds the format `...` to your system `strftime`.
Use `--date=format:%c` to show the date in your system locale's Use `--date=format:%c` to show the date in your system locale's
preferred format. See the `strftime` manual for a complete list of preferred format. See the `strftime` manual for a complete list of

View File

@ -2626,6 +2626,9 @@ parse_done:
case DATE_RAW: case DATE_RAW:
blame_date_width = sizeof("1161298804 -0700"); blame_date_width = sizeof("1161298804 -0700");
break; break;
case DATE_UNIX:
blame_date_width = sizeof("1161298804");
break;
case DATE_SHORT: case DATE_SHORT:
blame_date_width = sizeof("2006-10-19"); blame_date_width = sizeof("2006-10-19");
break; break;

View File

@ -1223,7 +1223,8 @@ struct date_mode {
DATE_ISO8601_STRICT, DATE_ISO8601_STRICT,
DATE_RFC2822, DATE_RFC2822,
DATE_STRFTIME, DATE_STRFTIME,
DATE_RAW DATE_RAW,
DATE_UNIX
} type; } type;
const char *strftime_fmt; const char *strftime_fmt;
int local; int local;

8
date.c
View File

@ -177,6 +177,12 @@ const char *show_date(unsigned long time, int tz, const struct date_mode *mode)
struct tm *tm; struct tm *tm;
static struct strbuf timebuf = STRBUF_INIT; static struct strbuf timebuf = STRBUF_INIT;
if (mode->type == DATE_UNIX) {
strbuf_reset(&timebuf);
strbuf_addf(&timebuf, "%lu", time);
return timebuf.buf;
}
if (mode->local) if (mode->local)
tz = local_tzoffset(time); tz = local_tzoffset(time);
@ -792,6 +798,8 @@ static enum date_mode_type parse_date_type(const char *format, const char **end)
return DATE_NORMAL; return DATE_NORMAL;
if (skip_prefix(format, "raw", end)) if (skip_prefix(format, "raw", end))
return DATE_RAW; return DATE_RAW;
if (skip_prefix(format, "unix", end))
return DATE_UNIX;
if (skip_prefix(format, "format", end)) if (skip_prefix(format, "format", end))
return DATE_STRFTIME; return DATE_STRFTIME;

View File

@ -46,8 +46,10 @@ check_show rfc2822 "$TIME" 'Wed, 15 Jun 2016 16:13:20 +0200'
check_show short "$TIME" '2016-06-15' check_show short "$TIME" '2016-06-15'
check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200' check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200'
check_show raw "$TIME" '1466000000 +0200' check_show raw "$TIME" '1466000000 +0200'
check_show unix "$TIME" '1466000000'
check_show iso-local "$TIME" '2016-06-15 14:13:20 +0000' check_show iso-local "$TIME" '2016-06-15 14:13:20 +0000'
check_show raw-local "$TIME" '1466000000 +0000' check_show raw-local "$TIME" '1466000000 +0000'
check_show unix-local "$TIME" '1466000000'
# arbitrary time absurdly far in the future # arbitrary time absurdly far in the future
FUTURE="5758122296 -0400" FUTURE="5758122296 -0400"