@@ -92,15 +92,15 @@ public static function parse($value, $flags = 0, $references = array())
9292 $ i = 0 ;
9393 switch ($ value [0 ]) {
9494 case '[ ' :
95- $ result = self ::parseSequence ($ value , $ i , $ references );
95+ $ result = self ::parseSequence ($ value , $ flags , $ i , $ references );
9696 ++$ i ;
9797 break ;
9898 case '{ ' :
99- $ result = self ::parseMapping ($ value , $ i , $ references );
99+ $ result = self ::parseMapping ($ value , $ flags , $ i , $ references );
100100 ++$ i ;
101101 break ;
102102 default :
103- $ result = self ::parseScalar ($ value , null , array ('" ' , "' " ), $ i , true , $ references );
103+ $ result = self ::parseScalar ($ value , $ flags , null , array ('" ' , "' " ), $ i , true , $ references );
104104 }
105105
106106 // some comments are allowed at the end
@@ -152,6 +152,8 @@ public static function dump($value, $flags = 0)
152152 }
153153
154154 return 'null ' ;
155+ case ($ value instanceof \DateTime || $ value instanceof \DateTimeImmutable):
156+ return $ value ->format ('c ' );
155157 case is_object ($ value ):
156158 if (Yaml::DUMP_OBJECT & $ flags ) {
157159 return '!php/object: ' .serialize ($ value );
@@ -243,6 +245,7 @@ private static function dumpArray($value, $flags)
243245 * Parses a scalar to a YAML string.
244246 *
245247 * @param string $scalar
248+ * @param int $flags
246249 * @param string $delimiters
247250 * @param array $stringDelimiters
248251 * @param int &$i
@@ -255,7 +258,7 @@ private static function dumpArray($value, $flags)
255258 *
256259 * @internal
257260 */
258- public static function parseScalar ($ scalar , $ delimiters = null , $ stringDelimiters = array ('" ' , "' " ), &$ i = 0 , $ evaluate = true , $ references = array ())
261+ public static function parseScalar ($ scalar , $ flags = 0 , $ delimiters = null , $ stringDelimiters = array ('" ' , "' " ), &$ i = 0 , $ evaluate = true , $ references = array ())
259262 {
260263 if (in_array ($ scalar [$ i ], $ stringDelimiters )) {
261264 // quoted scalar
@@ -290,7 +293,7 @@ public static function parseScalar($scalar, $delimiters = null, $stringDelimiter
290293 }
291294
292295 if ($ evaluate ) {
293- $ output = self ::evaluateScalar ($ output , $ references );
296+ $ output = self ::evaluateScalar ($ output , $ flags , $ references );
294297 }
295298 }
296299
@@ -331,14 +334,15 @@ private static function parseQuotedScalar($scalar, &$i)
331334 * Parses a sequence to a YAML string.
332335 *
333336 * @param string $sequence
337+ * @param int $flags
334338 * @param int &$i
335339 * @param array $references
336340 *
337341 * @return string A YAML string
338342 *
339343 * @throws ParseException When malformed inline YAML string is parsed
340344 */
341- private static function parseSequence ($ sequence , &$ i = 0 , $ references = array ())
345+ private static function parseSequence ($ sequence , $ flags , &$ i = 0 , $ references = array ())
342346 {
343347 $ output = array ();
344348 $ len = strlen ($ sequence );
@@ -349,11 +353,11 @@ private static function parseSequence($sequence, &$i = 0, $references = array())
349353 switch ($ sequence [$ i ]) {
350354 case '[ ' :
351355 // nested sequence
352- $ output [] = self ::parseSequence ($ sequence , $ i , $ references );
356+ $ output [] = self ::parseSequence ($ sequence , $ flags , $ i , $ references );
353357 break ;
354358 case '{ ' :
355359 // nested mapping
356- $ output [] = self ::parseMapping ($ sequence , $ i , $ references );
360+ $ output [] = self ::parseMapping ($ sequence , $ flags , $ i , $ references );
357361 break ;
358362 case '] ' :
359363 return $ output ;
@@ -362,14 +366,14 @@ private static function parseSequence($sequence, &$i = 0, $references = array())
362366 break ;
363367 default :
364368 $ isQuoted = in_array ($ sequence [$ i ], array ('" ' , "' " ));
365- $ value = self ::parseScalar ($ sequence , array (', ' , '] ' ), array ('" ' , "' " ), $ i , true , $ references );
369+ $ value = self ::parseScalar ($ sequence , $ flags , array (', ' , '] ' ), array ('" ' , "' " ), $ i , true , $ references );
366370
367371 // the value can be an array if a reference has been resolved to an array var
368372 if (!is_array ($ value ) && !$ isQuoted && false !== strpos ($ value , ': ' )) {
369373 // embedded mapping?
370374 try {
371375 $ pos = 0 ;
372- $ value = self ::parseMapping ('{ ' .$ value .'} ' , $ pos , $ references );
376+ $ value = self ::parseMapping ('{ ' .$ value .'} ' , $ flags , $ pos , $ references );
373377 } catch (\InvalidArgumentException $ e ) {
374378 // no, it's not
375379 }
@@ -390,14 +394,15 @@ private static function parseSequence($sequence, &$i = 0, $references = array())
390394 * Parses a mapping to a YAML string.
391395 *
392396 * @param string $mapping
397+ * @param int $flags
393398 * @param int &$i
394399 * @param array $references
395400 *
396401 * @return string A YAML string
397402 *
398403 * @throws ParseException When malformed inline YAML string is parsed
399404 */
400- private static function parseMapping ($ mapping , &$ i = 0 , $ references = array ())
405+ private static function parseMapping ($ mapping , $ flags , &$ i = 0 , $ references = array ())
401406 {
402407 $ output = array ();
403408 $ len = strlen ($ mapping );
@@ -419,7 +424,7 @@ private static function parseMapping($mapping, &$i = 0, $references = array())
419424 }
420425
421426 // key
422- $ key = self ::parseScalar ($ mapping , array (': ' , ' ' ), array ('" ' , "' " ), $ i , false );
427+ $ key = self ::parseScalar ($ mapping , $ flags , array (': ' , ' ' ), array ('" ' , "' " ), $ i , false );
423428
424429 // value
425430 $ done = false ;
@@ -428,7 +433,7 @@ private static function parseMapping($mapping, &$i = 0, $references = array())
428433 switch ($ mapping [$ i ]) {
429434 case '[ ' :
430435 // nested sequence
431- $ value = self ::parseSequence ($ mapping , $ i , $ references );
436+ $ value = self ::parseSequence ($ mapping , $ flags , $ i , $ references );
432437 // Spec: Keys MUST be unique; first one wins.
433438 // Parser cannot abort this mapping earlier, since lines
434439 // are processed sequentially.
@@ -439,7 +444,7 @@ private static function parseMapping($mapping, &$i = 0, $references = array())
439444 break ;
440445 case '{ ' :
441446 // nested mapping
442- $ value = self ::parseMapping ($ mapping , $ i , $ references );
447+ $ value = self ::parseMapping ($ mapping , $ flags , $ i , $ references );
443448 // Spec: Keys MUST be unique; first one wins.
444449 // Parser cannot abort this mapping earlier, since lines
445450 // are processed sequentially.
@@ -452,7 +457,7 @@ private static function parseMapping($mapping, &$i = 0, $references = array())
452457 case ' ' :
453458 break ;
454459 default :
455- $ value = self ::parseScalar ($ mapping , array (', ' , '} ' ), array ('" ' , "' " ), $ i , true , $ references );
460+ $ value = self ::parseScalar ($ mapping , $ flags , array (', ' , '} ' ), array ('" ' , "' " ), $ i , true , $ references );
456461 // Spec: Keys MUST be unique; first one wins.
457462 // Parser cannot abort this mapping earlier, since lines
458463 // are processed sequentially.
@@ -478,13 +483,14 @@ private static function parseMapping($mapping, &$i = 0, $references = array())
478483 * Evaluates scalars and replaces magic values.
479484 *
480485 * @param string $scalar
486+ * @param int $flags
481487 * @param array $references
482488 *
483489 * @return string A YAML string
484490 *
485491 * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
486492 */
487- private static function evaluateScalar ($ scalar , $ references = array ())
493+ private static function evaluateScalar ($ scalar , $ flags , $ references = array ())
488494 {
489495 $ scalar = trim ($ scalar );
490496 $ scalarLower = strtolower ($ scalar );
@@ -523,7 +529,7 @@ private static function evaluateScalar($scalar, $references = array())
523529 case 0 === strpos ($ scalar , '!str ' ):
524530 return (string ) substr ($ scalar , 5 );
525531 case 0 === strpos ($ scalar , '! ' ):
526- return (int ) self ::parseScalar (substr ($ scalar , 2 ));
532+ return (int ) self ::parseScalar (substr ($ scalar , 2 ), $ flags );
527533 case 0 === strpos ($ scalar , '!php/object: ' ):
528534 if (self ::$ objectSupport ) {
529535 return unserialize (substr ($ scalar , 12 ));
@@ -568,8 +574,15 @@ private static function evaluateScalar($scalar, $references = array())
568574 return log (0 );
569575 case preg_match ('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/ ' , $ scalar ):
570576 return (float ) str_replace (', ' , '' , $ scalar );
577+ case preg_match (self ::getTimestampRegex (), $ scalar ) && Yaml::PARSE_DATETIME & $ flags :
578+ return new \DateTime ($ scalar ,new \DateTimeZone ('UTC ' ));
571579 case preg_match (self ::getTimestampRegex (), $ scalar ):
572- return strtotime ($ scalar );
580+ $ timeZone = date_default_timezone_get ();
581+ date_default_timezone_set ('UTC ' );
582+ $ time = strtotime ($ scalar );
583+ date_default_timezone_set ($ timeZone );
584+
585+ return $ time ;
573586 }
574587 default :
575588 return (string ) $ scalar ;
0 commit comments