summaryrefslogtreecommitdiff
path: root/program/include/main.inc
diff options
context:
space:
mode:
Diffstat (limited to 'program/include/main.inc')
-rw-r--r--program/include/main.inc49
1 files changed, 33 insertions, 16 deletions
diff --git a/program/include/main.inc b/program/include/main.inc
index 0815c259f..8e8de03a3 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -978,6 +978,37 @@ function parse_attrib_string($str)
/**
+ * Improved equivalent to strtotime()
+ *
+ * @param string Date string
+ * @return int
+ */
+function rcube_strtotime($date)
+{
+ // check for MS Outlook vCard date format YYYYMMDD
+ if (preg_match('/^([12][90]\d\d)([01]\d)(\d\d)$/', trim($date), $matches)) {
+ return mktime(0,0,0, intval($matches[2]), intval($matches[3]), intval($matches[1]));
+ }
+ else if (is_numeric($date))
+ return $date;
+
+ // support non-standard "GMTXXXX" literal
+ $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date);
+
+ // if date parsing fails, we have a date in non-rfc format.
+ // remove token from the end and try again
+ while ((($ts = @strtotime($date)) === false) || ($ts < 0)) {
+ $d = explode(' ', $date);
+ array_pop($d);
+ if (!$d) break;
+ $date = implode(' ', $d);
+ }
+
+ return $ts;
+}
+
+
+/**
* Convert the given date to a human readable form
* This uses the date formatting properties from config
*
@@ -991,22 +1022,8 @@ function format_date($date, $format=NULL)
$ts = NULL;
- if (is_numeric($date))
- $ts = $date;
- else if (!empty($date))
- {
- // support non-standard "GMTXXXX" literal
- $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date);
- // if date parsing fails, we have a date in non-rfc format.
- // remove token from the end and try again
- while ((($ts = @strtotime($date))===false) || ($ts < 0))
- {
- $d = explode(' ', $date);
- array_pop($d);
- if (!$d) break;
- $date = implode(' ', $d);
- }
- }
+ if (!empty($date))
+ $ts = rcube_strtotime($date);
if (empty($ts))
return '';