This makes busybox date more compatible with coreutils and fixes a TODO
in libbb/time.c.

Signed-off-by: Bartosz Golaszewski <[email protected]>
---
 libbb/time.c |   16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/libbb/time.c b/libbb/time.c
index 57e14b6..3d8305d 100644
--- a/libbb/time.c
+++ b/libbb/time.c
@@ -58,7 +58,6 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm 
*ptm)
                        return; /* don't fall through to end == ":" check */
                } else
 #endif
-//TODO: coreutils 6.9 also accepts "yyyy-mm-dd HH" (no minutes)
                {
                        bb_error_msg_and_die(bb_msg_invalid_date, date_str);
                }
@@ -68,7 +67,20 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm 
*ptm)
                                end = '\0';
                        /* else end != NUL and we error out */
                }
-       } else if (date_str[0] == '@') {
+       } else
+       /* yyyy-mm-dd HH */
+       if ((sscanf(date_str, "%u-%u-%u %u%c", &ptm->tm_year,
+                               &ptm->tm_mon, &ptm->tm_mday,
+                               &ptm->tm_hour, &end) >= 4) ||
+       /* yyyy-mm-dd */
+               (sscanf(date_str, "%u-%u-%u%c", &ptm->tm_year,
+                               &ptm->tm_mon, &ptm->tm_mday, &end) >= 3))
+       {
+               ptm->tm_year -= 1900; /* Adjust years */
+               ptm->tm_mon -= 1; /* Adjust month from 1-12 to 0-11 */
+       } else
+       /* unix timestamp */
+       if (date_str[0] == '@') {
                time_t t = bb_strtol(date_str + 1, NULL, 10);
                if (!errno) {
                        struct tm *lt = localtime(&t);
-- 
1.7.10.4

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to