[git commit master 1/1] date, touch: treat 2-digit years better (fit them into +-50 yrs around today)

Denys Vlasenko vda.linux at googlemail.com
Sun Jan 2 19:02:09 UTC 2011


commit: http://git.busybox.net/busybox/commit/?id=92ffe0571a49077f06fc65bf0ada753b30fd8a53
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 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 3521771..6c2b948 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 2a74d34..1eb2d75 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",
-- 
1.7.2.2



More information about the busybox-cvs mailing list