]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/DateTimeFormat.php
Merge pull request #11973 from MrPetovan/task/test-fixDateFormat
[friendica.git] / src / Util / DateTimeFormat.php
index fdb49dabdceeef7a1212b21b4ee7b245146d01ef..862ce6e9affe08e0e87b6df66d1700c442ba8597 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -35,6 +35,7 @@ class DateTimeFormat
        const MYSQL = 'Y-m-d H:i:s';
        const HTTP  = 'D, d M Y H:i:s \G\M\T';
        const JSON  = 'Y-m-d\TH:i:s.v\Z';
+       const API   = 'D M d H:i:s +0000 Y';
 
        static $localTimezone = 'UTC';
 
@@ -51,7 +52,7 @@ class DateTimeFormat
         * @return string
         * @throws Exception
         */
-       public static function utc($time, $format = self::MYSQL)
+       public static function utc(string $time, string $format = self::MYSQL): string
        {
                return self::convert($time, 'UTC', 'UTC', $format);
        }
@@ -101,7 +102,7 @@ class DateTimeFormat
         * @return string
         * @throws Exception
         */
-       public static function utcNow($format = self::MYSQL)
+       public static function utcNow(string $format = self::MYSQL): string
        {
                return self::utc('now', $format);
        }
@@ -134,6 +135,8 @@ class DateTimeFormat
                        $s = 'now';
                }
 
+               $s = self::fix($s);
+
                /*
                 * Slight hackish adjustment so that 'zero' datetime actually returns what is intended
                 * otherwise we end up with -0001-11-30 ...
@@ -157,7 +160,7 @@ class DateTimeFormat
                try {
                        $d = new DateTime($s, $from_obj);
                } catch (Exception $e) {
-                       Logger::log('DateTimeFormat::convert: exception: ' . $e->getMessage());
+                       Logger::warning('DateTimeFormat::convert: exception: ' . $e->getMessage());
                        $d = new DateTime('now', $from_obj);
                }
 
@@ -172,6 +175,32 @@ class DateTimeFormat
                return $d->format($format);
        }
 
+       /**
+        * Fix weird date formats
+        *
+        * @see \Friendica\Test\src\Util\DateTimeFormatTest::dataFix() for a list of examples handled by this method.
+        * @param string $dateString
+        * @return string
+        */
+       public static function fix(string $dateString): string
+       {
+               $patterns = [
+                       ['#(\w+), (\d+/\d+/\d+) - (\d+:\d+)#', '$1, $2 $3'],
+                       ['#(\d+-\d+-\d+)T(\d+:\d+:\d+)ZZ#', '$1T$2Z'],
+                       ['#(\d+-\d+-\d+)T(\d+:\d+:\d+\.\d+)ZZ#', '$1T$2Z'],
+                       ['#(\w+), (\d+ \w+ \d+) (\d+:\d+:\d+) (.+)#', '$2 $3 $4'],
+                       ['#(\d+:\d+) (\w+), (\w+) (\d+), (\d+)#', '$1 $2 $3 $4 $5'],
+                       ['#(\w+ \d+, \d+) - (\d+:\d+)#', '$1, $2'],
+                       ['~(\d+-\d+-\d+)T(\d+:\d+:\d+)&#x2B;(\d+:\d+)~', '$1T$2+$3'],
+               ];
+
+               foreach ($patterns as $pattern) {
+                       $dateString = preg_replace($pattern[0], $pattern[1], $dateString);
+               }
+
+               return $dateString;
+       }
+
        /**
         * Checks, if the given string is a date with the pattern YYYY-MM
         *