X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=date.c;h=a9b59a289e7b22f34958ccc7b80b02a01cf793c6;hb=467592ea926d105e1cb78b2471b28bf37e8c62c6;hp=18259227321f47988386c2bd70888b3c967d8ab6;hpb=f5961572a02ef08324f297fe93b704ff2137e5a6;p=git.git diff --git a/date.c b/date.c index 182592273..a9b59a289 100644 --- a/date.c +++ b/date.c @@ -4,9 +4,6 @@ * Copyright (C) Linus Torvalds, 2005 */ -#include -#include - #include "cache.h" static time_t my_mktime(struct tm *tm) @@ -58,19 +55,44 @@ static struct tm *time_to_tm(unsigned long time, int tz) return gmtime(&t); } -const char *show_date(unsigned long time, int tz, int relative) +/* + * What value of "tz" was in effect back then at "time" in the + * local timezone? + */ +static int local_tzoffset(unsigned long time) +{ + time_t t, t_local; + struct tm tm; + int offset, eastwest; + + t = time; + localtime_r(&t, &tm); + t_local = my_mktime(&tm); + + if (t_local < t) { + eastwest = -1; + offset = t - t_local; + } else { + eastwest = 1; + offset = t_local - t; + } + offset /= 60; /* in minutes */ + offset = (offset % 60) + ((offset / 60) * 100); + return offset * eastwest; +} + +const char *show_date(unsigned long time, int tz, enum date_mode mode) { struct tm *tm; static char timebuf[200]; - if (relative) { + if (mode == DATE_RELATIVE) { unsigned long diff; - time_t t = gm_time_t(time, tz); struct timeval now; gettimeofday(&now, NULL); - if (now.tv_sec < t) + if (now.tv_sec < time) return "in the future"; - diff = now.tv_sec - t; + diff = now.tv_sec - time; if (diff < 90) { snprintf(timebuf, sizeof(timebuf), "%lu seconds ago", diff); return timebuf; @@ -106,15 +128,24 @@ const char *show_date(unsigned long time, int tz, int relative) /* Else fall back on absolute format.. */ } + if (mode == DATE_LOCAL) + tz = local_tzoffset(time); + tm = time_to_tm(time, tz); if (!tm) return NULL; - sprintf(timebuf, "%.3s %.3s %d %02d:%02d:%02d %d %+05d", - weekday_names[tm->tm_wday], - month_names[tm->tm_mon], - tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec, - tm->tm_year + 1900, tz); + if (mode == DATE_SHORT) + sprintf(timebuf, "%04d-%02d-%02d", tm->tm_year + 1900, + tm->tm_mon + 1, tm->tm_mday); + else + sprintf(timebuf, "%.3s %.3s %d %02d:%02d:%02d %d%c%+05d", + weekday_names[tm->tm_wday], + month_names[tm->tm_mon], + tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec, + tm->tm_year + 1900, + (mode == DATE_LOCAL) ? 0 : ' ', + tz); return timebuf; }