const char *show_date(unsigned long time, int tz, enum date_mode mode) { struct tm *tm; static char timebuf[200]; if (mode == DATE_RAW) { snprintf(timebuf, sizeof(timebuf), "%lu %+05d", time, tz); return timebuf; } if (mode == DATE_RELATIVE) { struct timeval now; gettimeofday(&now, NULL); return show_date_relative(time, tz, &now, timebuf, sizeof(timebuf)); } if (mode == DATE_LOCAL) tz = local_tzoffset(time); tm = time_to_tm(time, tz); if (!tm) return NULL; if (mode == DATE_SHORT) sprintf(timebuf, "%04d-%02d-%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); else if (mode == DATE_ISO8601) sprintf(timebuf, "%04d-%02d-%02d %02d:%02d:%02d %+05d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); else if (mode == DATE_RFC2822) sprintf(timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", weekday_names[tm->tm_wday], tm->tm_mday, month_names[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); 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; }
const char *show_date(unsigned long time, int tz, enum date_mode mode) { struct tm *tm; static struct strbuf timebuf = STRBUF_INIT; if (mode == DATE_RAW) { strbuf_reset(&timebuf); strbuf_addf(&timebuf, "%lu %+05d", time, tz); return timebuf.buf; } if (mode == DATE_RELATIVE) { struct timeval now; strbuf_reset(&timebuf); gettimeofday(&now, NULL); show_date_relative(time, tz, &now, &timebuf); return timebuf.buf; } if (mode == DATE_LOCAL) tz = local_tzoffset(time); tm = time_to_tm(time, tz); if (!tm) { tm = time_to_tm(0, 0); tz = 0; } strbuf_reset(&timebuf); if (mode == DATE_SHORT) strbuf_addf(&timebuf, "%04d-%02d-%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); else if (mode == DATE_ISO8601) strbuf_addf(&timebuf, "%04d-%02d-%02d %02d:%02d:%02d %+05d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); else if (mode == DATE_ISO8601_STRICT) { char sign = (tz >= 0) ? '+' : '-'; tz = abs(tz); strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, sign, tz / 100, tz % 100); } else if (mode == DATE_RFC2822) strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", weekday_names[tm->tm_wday], tm->tm_mday, month_names[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); else strbuf_addf(&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.buf; }
const char *show_date(unsigned long time, int tz, enum date_mode mode) { struct tm *tm; static char timebuf[200]; if (mode == DATE_RELATIVE) { unsigned long diff; struct timeval now; gettimeofday(&now, NULL); if (now.tv_sec < time) return "in the future"; diff = now.tv_sec - time; if (diff < 90) { snprintf(timebuf, sizeof(timebuf), "%lu seconds ago", diff); return timebuf; } /* Turn it into minutes */ diff = (diff + 30) / 60; if (diff < 90) { snprintf(timebuf, sizeof(timebuf), "%lu minutes ago", diff); return timebuf; } /* Turn it into hours */ diff = (diff + 30) / 60; if (diff < 36) { snprintf(timebuf, sizeof(timebuf), "%lu hours ago", diff); return timebuf; } /* We deal with number of days from here on */ diff = (diff + 12) / 24; if (diff < 14) { snprintf(timebuf, sizeof(timebuf), "%lu days ago", diff); return timebuf; } /* Say weeks for the past 10 weeks or so */ if (diff < 70) { snprintf(timebuf, sizeof(timebuf), "%lu weeks ago", (diff + 3) / 7); return timebuf; } /* Say months for the past 12 months or so */ if (diff < 360) { snprintf(timebuf, sizeof(timebuf), "%lu months ago", (diff + 15) / 30); return timebuf; } /* Else fall back on absolute format.. */ } if (mode == DATE_LOCAL) tz = local_tzoffset(time); tm = time_to_tm(time, tz); if (!tm) return NULL; if (mode == DATE_SHORT) sprintf(timebuf, "%04d-%02d-%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); else if (mode == DATE_ISO8601) sprintf(timebuf, "%04d-%02d-%02d %02d:%02d:%02d %+05d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); else if (mode == DATE_RFC2822) sprintf(timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", weekday_names[tm->tm_wday], tm->tm_mday, month_names[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); 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; }