Browse Source

DateTimeHelper::parse(): support iso strings without seconds

Fabian Peter Hammerle 7 years ago
parent
commit
f5ec3d7c38
2 changed files with 27 additions and 19 deletions
  1. 5 9
      DateTimeHelper.php
  2. 22 10
      tests/DateTimeHelperTest.php

+ 5 - 9
DateTimeHelper.php

@@ -32,20 +32,16 @@ class DateTimeHelper
         } else {
             if(preg_match(
                     '/^(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})'
-                        .'([ T](?P<h>\d{2}):(?P<i>\d{2}):(?P<s>\d{2}))?'
+                        .'([ T](?P<h>\d{2}):(?P<i>\d{2})(:(?P<s>\d{2}))?)?'
                         . '(Z|[\+-]\d{2}:\d{2})?$/',
                     $text,
                     $attr
                     )) {
-                $start = new \DateTime($attr[0]);
-                $start->setDate($attr['y'], $attr['m'], $attr['d']);
-                $start->setTime(
-                    empty($attr['h']) ? 0 : $attr['h'],
-                    empty($attr['i']) ? 0 : $attr['i'],
-                    empty($attr['s']) ? 0 : $attr['s']
-                    );
-                if(!empty($attr['h'])) {
+                $start = new \DateTime($text);
+                if(!empty($attr['s'])) {
                     $interval = new \DateInterval('PT1S');
+                } elseif(!empty($attr['i'])) {
+                    $interval = new \DateInterval('PT1M');
                 } else {
                     $interval = new \DateInterval('P1D');
                 }

+ 22 - 10
tests/DateTimeHelperTest.php

@@ -64,16 +64,28 @@ class DateTimeHelperTest extends \PHPUnit_Framework_TestCase
             ['2016-08-02',       'US/Pacific', new DP(new DT('2016-08-02T07:00:00Z'),      new DI('P1D'), 0)],
             ['2016-08-02+02:00', 'UTC',        new DP(new DT('2016-08-02T00:00:00+02:00'), new DI('P1D'), 0)],
             ['2016-08-02+02:00', 'UTC',        new DP(new DT('2016-08-01T22:00:00Z'),      new DI('P1D'), 0)],
-            // second
-            ['2016-08-02 15:52:13',       'UTC',           new DP(new DT('2016-08-02T15:52:13Z'),      new DI('PT1S'), 0)],
-            ['2016-08-02 15:52:13',       'Europe/Vienna', new DP(new DT('2016-08-02T15:52:13+02:00'), new DI('PT1S'), 0)],
-            ['2016-08-02 15:52:13',       'Europe/Vienna', new DP(new DT('2016-08-02T13:52:13Z'),      new DI('PT1S'), 0)],
-            ['2016-08-02T15:52:13',       'US/Pacific',    new DP(new DT('2016-08-02T15:52:13-07:00'), new DI('PT1S'), 0)],
-            ['2016-08-02T15:52:13Z',      'US/Pacific',    new DP(new DT('2016-08-02T15:52:13Z'),      new DI('PT1S'), 0)],
-            ['2016-08-02T15:52:13Z',      'Europe/Vienna', new DP(new DT('2016-08-02T17:52:13+02:00'), new DI('PT1S'), 0)],
-            ['2016-08-02T15:52:13+00:00', 'Europe/Vienna', new DP(new DT('2016-08-02T15:52:13Z'),      new DI('PT1S'), 0)],
-            ['2016-08-02T15:52:13+02:00', 'US/Pacific',    new DP(new DT('2016-08-02T15:52:13+02:00'), new DI('PT1S'), 0)],
-            ['2016-08-02T15:52:13-08:00', 'UTC',           new DP(new DT('2016-08-02T23:52:13Z'),      new DI('PT1S'), 0)],
+            // minute without timezone
+            ['2016-08-02 15:52', 'UTC',           new DP(new DT('2016-08-02T15:52:00Z'),      new DI('PT1M'), 0)],
+            ['2016-08-02T15:52', 'UTC',           new DP(new DT('2016-08-02T15:52:00Z'),      new DI('PT1M'), 0)],
+            ['2016-08-02T15:52', 'Europe/Vienna', new DP(new DT('2016-08-02T15:52:00+02:00'), new DI('PT1M'), 0)],
+            ['2016-01-02T15:52', 'US/Pacific',    new DP(new DT('2016-01-02T15:52:00-08:00'), new DI('PT1M'), 0)],
+            // minute with timezone
+            ['2016-08-02 15:52Z',      'US/Pacific',    new DP(new DT('2016-08-02T15:52:00Z'),      new DI('PT1M'), 0)],
+            ['2016-08-02T15:52Z',      'Europe/Vienna', new DP(new DT('2016-08-02T15:52:00Z'),      new DI('PT1M'), 0)],
+            ['2016-01-02T15:52+00:00', 'Europe/Vienna', new DP(new DT('2016-01-02T15:52:00Z'),      new DI('PT1M'), 0)],
+            ['2016-01-02T15:52+02:00', 'US/Pacific',    new DP(new DT('2016-01-02T15:52:00+02:00'), new DI('PT1M'), 0)],
+            ['2016-01-02T15:52-08:00', 'UTC',           new DP(new DT('2016-01-02T15:52:00-08:00'), new DI('PT1M'), 0)],
+            // second without timezone
+            ['2016-08-02 15:52:13', 'UTC',           new DP(new DT('2016-08-02T15:52:13Z'),      new DI('PT1S'), 0)],
+            ['2016-08-02T15:52:13', 'UTC',           new DP(new DT('2016-08-02T15:52:13Z'),      new DI('PT1S'), 0)],
+            ['2016-08-02T15:52:13', 'Europe/Vienna', new DP(new DT('2016-08-02T15:52:13+02:00'), new DI('PT1S'), 0)],
+            ['2016-01-02T15:52:00', 'US/Pacific',    new DP(new DT('2016-01-02T15:52:00-08:00'), new DI('PT1S'), 0)],
+            // second with timezone
+            ['2016-08-02 15:52:13Z',      'US/Pacific',    new DP(new DT('2016-08-02T15:52:13Z'),      new DI('PT1S'), 0)],
+            ['2016-08-02T15:52:13Z',      'Europe/Vienna', new DP(new DT('2016-08-02T15:52:13Z'),      new DI('PT1S'), 0)],
+            ['2016-01-02T15:52:13+00:00', 'Europe/Vienna', new DP(new DT('2016-01-02T15:52:13Z'),      new DI('PT1S'), 0)],
+            ['2016-01-02T15:52:13+02:00', 'US/Pacific',    new DP(new DT('2016-01-02T15:52:13+02:00'), new DI('PT1S'), 0)],
+            ['2016-01-02T15:52:13-08:00', 'UTC',           new DP(new DT('2016-01-02T15:52:13-08:00'), new DI('PT1S'), 0)],
             ];
     }