diff -Naur a/toys/posix/date.c b/toys/posix/date.c
--- a/toys/posix/date.c	2014-10-02 18:23:27.000000000 +0530
+++ b/toys/posix/date.c	2014-10-06 17:52:11.384626683 +0530
@@ -1,13 +1,14 @@
 /* date.c - set/get the date
  *
  * Copyright 2012 Andre Renaud <andre@bluewatersys.com>
+ * Copyright 2014 Bilal Qureshi <bilal.jmi@gmail.com>
  *
  * See http://opengroup.org/onlinepubs/9699919799/utilities/date.html
  *
  * Note: setting a 2 year date is 50 years back/forward from today,
  * not posix's hardwired magic dates.
 
-USE_DATE(NEWTOY(date, "d:s:r:u[!dr]", TOYFLAG_BIN))
+USE_DATE(NEWTOY(date, "d(date):s(set):r(reference):u(utc)[!dr][!ds][!rs]", TOYFLAG_BIN))
 
 config DATE
   bool "date"
@@ -47,49 +48,90 @@
 
 GLOBALS(
   char *file;
-  char *setfmt;
+  char *setdate;
   char *showdate;
 )
 
-// Handle default posix date format: mmddhhmm[[cc]yy]
-// returns 0 success, nonzero for error
-int parse_posixdate(char *str, struct tm *tm)
+static int parse_posixdate(char *str, struct tm *tm)
 {
-  int len;
+  char *lst_col = strrchr(str, ':'), ch = 0;
+  errno = 0;
 
-  len = 0;
-  sscanf(str, "%2u%2u%2u%2u%n", &tm->tm_mon, &tm->tm_mday, &tm->tm_hour,
-    &tm->tm_min, &len);
-  if (len != 8) return 1;
-  str += len;
-  tm->tm_mon--;
-
-  // If year specified, overwrite one we fetched earlier
-  if (*str && *str != '.') {
-    unsigned year, r1 = tm->tm_year % 100, r2 = (tm->tm_year + 50) % 100,
-      century = tm->tm_year - r1;
-
-    len = 0;
-    sscanf(str, "%u%n", &year, &len);
-    if (len == 4) year -= 1900;
-    else if (len != 2) return 1;
-    str += len;
-
-    // 2 digit years, next 50 years are "future", last 50 years are "past".
-    // A "future" date in past is a century ahead.
-    // A non-future date in the future is a century behind.
-    if ((r1 < r2) ? (r1 < year && year < r2) : (year < r1 || year > r2)) {
-      if (year < r1) year += 100;
-    } else if (year > r1) year -= 100;
-    tm->tm_year = year + century;
-  }
-  if (*str == '.') {
-    len = 0;
-    sscanf(str, ".%u%n", &tm->tm_sec, &len);
-    str += len;
-  }
+  if (lst_col) {
+    char *end_ptr;
+
+    if (sscanf(str, "%u:%u%c", &tm->tm_hour, &tm->tm_min, &ch) >= 2) { // HH:MM
+    } else if (sscanf(str, "%u.%u-%u:%u%c", &tm->tm_mon, &tm->tm_mday, 
+          &tm->tm_hour, &tm->tm_min, &ch) >= 4) { // mm.dd-HH:MM
+      tm->tm_mon -= 1;
+    } else if (sscanf(str, "%u.%u.%u-%u:%u%c", &tm->tm_year, &tm->tm_mon, 
+          &tm->tm_mday, &tm->tm_hour, &tm->tm_min, &ch) >= 5
+        || sscanf(str, "%u-%u-%u %u:%u%c", &tm->tm_year, &tm->tm_mon,
+          &tm->tm_mday, &tm->tm_hour, &tm->tm_min, &ch) >= 5
+        ) { // yyyy.mm.dd-HH:MM || yyyy-mm-dd HH:MM
+      tm->tm_year -= 1900;  
+      tm->tm_mon -= 1; 
+    } else if ((end_ptr = strptime(str, "%b %d %T %Y", tm)) 
+        && !*end_ptr) {  // Monthname d HH:MM:SS YYYY
+      return 0; 
+    } else return 1;
+
+    if (ch == ':') 
+      if (sscanf(lst_col + 1, "%u%c", &tm->tm_sec, &ch) == 1) ch = '\0';
+  } else if (sscanf(str, "%u-%u-%u %u%c", &tm->tm_year, &tm->tm_mon, 
+        &tm->tm_mday, &tm->tm_hour, &ch) >= 4
+      || sscanf(str, "%u-%u-%u%c", &tm->tm_year, &tm->tm_mon, &tm->tm_mday,
+        &ch) >= 3) { // yyyy-mm-dd HH || yyyy-mm-dd
+    tm->tm_year -= 1900; 
+    tm->tm_mon -= 1;
+  } else if (str[0] == '@') {
+    time_t t = strtol(str + 1, NULL, 10);
+
+    if (!errno) {
+      struct tm *ltm = localtime(&t);
+
+      if (ltm) {
+        *tm = *ltm;
+        return 0;
+      }
+    }
+    ch = '1';
+  } else {
+    int crnt_year = tm->tm_year, len = strlen(str);
 
-  return *str;
+    if (sscanf(str, "%2u%2u%2u%2u""%2u%c" + 12, &tm->tm_min, &ch) >= 1 
+        && len == 2) { // MM[.SS]
+    } else if (sscanf(str, "%2u%2u%2u""%2u%2u%c" + 9, &tm->tm_hour, 
+          &tm->tm_min, &ch) >= 2 && len == 4) { // HHMM[.SS]
+    } else if (sscanf(str, "%2u%2u""%2u%2u%2u%c" + 6, &tm->tm_mday, 
+          &tm->tm_hour, &tm->tm_min, &ch) >= 3 && len == 6) { // ddHHMM[.SS]
+    } else if (sscanf(str, "%2u""%2u%2u%2u%2u%c" + 3, &tm->tm_mon, 
+          &tm->tm_mday, &tm->tm_hour, &tm->tm_min, &ch) >= 4 
+        && len ==8) { // mmddHHMM[.SS]
+      tm->tm_mon -= 1;
+    } else if (sscanf(str, "%2u%2u%2u%2u%2u%c", &tm->tm_year,
+          &tm->tm_mon, &tm->tm_mday, &tm->tm_hour, &tm->tm_min,
+          &ch) >= 5 && len == 10) { // yymmddHHMM[.SS]
+      tm->tm_mon -= 1;
+      if (crnt_year >= 50) { 
+        tm->tm_year += (crnt_year / 100) * 100;
+        if (tm->tm_year < crnt_year - 50) tm->tm_year += 100;
+        if (tm->tm_year > crnt_year + 50) tm->tm_year -= 100;
+      }
+    } else if (len == 12 && sscanf(str, "%4u%2u%2u%2u%2u%c", &tm->tm_year,
+          &tm->tm_mon, &tm->tm_mday, &tm->tm_hour, &tm->tm_min,
+          &ch) >= 5) { // ccyymmddHHMM[.SS]
+      tm->tm_year -= 1900; 
+      tm->tm_mon -= 1; 
+    } else return 1;
+
+    if (ch == '.') {
+      if (sscanf(strchr(str, '.') + 1, "%u%c", &tm->tm_sec, &ch) == 1) 
+        ch = '\0';
+    }
+  }
+  if (ch) return 1;
+  return 0;
 }
 
 void date_main(void)
@@ -97,53 +139,54 @@
   char *setdate = *toys.optargs, *format_string = "%a %b %e %H:%M:%S %Z %Y",
        *tz = 0;
   struct tm tm;
+  time_t now;
 
   // We can't just pass a timezone to mktime because posix.
   if (toys.optflags & FLAG_u) {
     if (CFG_TOYBOX_FREE) tz = getenv("TZ");
-    setenv("TZ", "UTC", 1);
+    setenv("TZ", "UTC0", 1);
     tzset();
   }
 
-  if (TT.showdate) {
-    setdate = TT.showdate;
-    if (TT.setfmt) {
-      char *s = strptime(TT.showdate, TT.setfmt+(*TT.setfmt=='+'), &tm);
+  if (toys.optflags & FLAG_r) {
+    struct stat st;
 
-      if (!s || *s) goto bad_date;
-    } else if (parse_posixdate(TT.showdate, &tm)) goto bad_date;
-  } else {
-    time_t now;
+    xstat(TT.file, &st);
+    now = st.st_mtim.tv_sec;
+  } else now = time(0);
+  localtime_r(&now, &tm);
 
-    if (TT.file) {
-      struct stat st;
+  if (toys.optflags & FLAG_d) {
+    time_t time;
 
-      xstat(TT.file, &st);
-      now = st.st_mtim.tv_sec;
-    } else now = time(0);
+    tm.tm_sec = 0;
+    tm.tm_min = 0;
+    tm.tm_hour = 0;
+    if (parse_posixdate(TT.showdate, &tm)) 
+      error_exit("bad date '%s'", TT.showdate);
+    if (TT.showdate[0] != '@') tm.tm_isdst = -1;
+    if ((time = mktime(&tm)) == (time_t) -1) 
+      error_exit("bad date '%s'", TT.showdate); 
+  }
 
-    ((toys.optflags & FLAG_u) ? gmtime_r : localtime_r)(&now, &tm);
+  if ((toys.optflags & FLAG_s) && setdate) {
+    toys.exithelp++;
+    error_exit("invalid argument");
   }
 
-  setdate = *toys.optargs;
-  // Fall through if no arguments
-  if (!setdate);
-  // Display the date?
-  else if (*setdate == '+') {
+  if (setdate && *setdate == '+') {
     format_string = toys.optargs[0]+1;
     setdate = toys.optargs[1];
-
-  // Set the date
-  } else if (setdate) {
+  } else if ((toys.optflags & FLAG_s) || setdate) {
     struct timeval tv;
 
-    if (parse_posixdate(setdate, &tm)) goto bad_date;
-
+    if (TT.setdate) setdate = TT.setdate;
+    if (parse_posixdate(setdate, &tm)) error_exit("bad date '%s'", setdate);
     if (toys.optflags & FLAG_u) {
       char *tz = CFG_TOYBOX_FREE ? getenv("TZ") : 0;
 
       // We can't just pass a timezone to mktime because posix.
-      setenv("TZ", "UTC", 1);
+      if (tz) setenv("TZ", "UTC0", 1);
       tzset();
       tv.tv_sec = mktime(&tm);
       if (CFG_TOYBOX_FREE) {
@@ -152,24 +195,13 @@
         tzset();
       }
     } else tv.tv_sec = mktime(&tm);
-    if (tv.tv_sec == (time_t)-1) goto bad_date;
-
+    if (tv.tv_sec == (time_t) - 1) error_exit("bad date '%s'", setdate);
     tv.tv_usec = 0;
-    if (settimeofday(&tv, NULL) < 0) perror_msg("cannot set date");
-  }
+    if (settimeofday(&tv, NULL) < 0) perror_exit("cannot set date");
+  } 
 
-  if (toys.optflags & FLAG_u) {
-    if (tz) setenv("TZ", tz, 1);
-    else unsetenv("TZ");
-    tzset();
-  }
-
-  if (!strftime(toybuf, sizeof(toybuf), format_string, &tm))
+  if (!*format_string) toybuf[0] = '\0'; 
+  else if(!strftime(toybuf, sizeof(toybuf), format_string, &tm))
     perror_exit("bad format '%s'", format_string);
   puts(toybuf);
-
-  return;
-
-bad_date:
-  error_exit("bad date '%s'", setdate);
 }
