From 92ffe0571a49077f06fc65bf0ada753b30fd8a53 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 2 Jan 2011 20:02:09 +0100 Subject: [PATCH] date,touch: treat 2-digit years better (fit them into +-50 yrs around today) Signed-off-by: Denys Vlasenko --- coreutils/touch.c | 7 ++++--- libbb/time.c | 12 ++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/coreutils/touch.c b/coreutils/touch.c index 352177111..6c2b948e6 100644 --- a/coreutils/touch.c +++ b/coreutils/touch.c @@ -120,9 +120,10 @@ int touch_main(int argc UNUSED_PARAM, char **argv) struct tm tm_time; time_t t; - //time(&t); - //localtime_r(&t, &tm_time); - memset(&tm_time, 0, sizeof(tm_time)); + //memset(&tm_time, 0, sizeof(tm_time)); + /* Better than memset: makes "HH:MM" dates meaningful */ + time(&t); + localtime_r(&t, &tm_time); parse_datestr(date_str, &tm_time); /* Correct any day of week and day of year etc. fields */ diff --git a/libbb/time.c b/libbb/time.c index 2a74d34c2..1eb2d75c2 100644 --- a/libbb/time.c +++ b/libbb/time.c @@ -93,6 +93,7 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm) * * This coincides with the format of "touch -t TIME" */ + unsigned cur_year = ptm->tm_year; int len = strchrnul(date_str, '.') - date_str; /* MM[.SS] */ @@ -133,6 +134,17 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm) &end) >= 5) { /* Adjust month from 1-12 to 0-11 */ ptm->tm_mon -= 1; + if ((int)cur_year >= 50) { /* >= 1950 */ + /* Adjust year: */ + /* 1. Put it in the current century */ + ptm->tm_year += (cur_year / 100) * 100; + /* 2. If too far in the past, +100 years */ + if (ptm->tm_year < cur_year - 50) + ptm->tm_year += 100; + /* 3. If too far in the future, -100 years */ + if (ptm->tm_year > cur_year + 50) + ptm->tm_year -= 100; + } } else /* ccyymmddHHMM[.SS] */ if (len == 12 && sscanf(date_str, "%4u%2u%2u%2u%2u%c",