1--TEST-- 2Test DateInterval::__serialize and DateInterval::__unserialize 3--FILE-- 4<?php 5date_default_timezone_set("Europe/London"); 6 7$d = DateInterval::createFromDateString('next weekday'); 8echo "Original object:\n"; 9var_dump($d); 10 11echo "\n\nSerialised object:\n"; 12$s = serialize($d); 13var_dump($s); 14 15echo "\n\nUnserialised object:\n"; 16$e = unserialize($s); 17var_dump($e); 18 19echo "\n\nCalling __serialize manually:\n"; 20var_dump($d->__serialize()); 21 22echo "\n\nCalling __unserialize manually:\n"; 23$d = new DateInterval('P2Y4DT6H8M'); 24$d->__unserialize( 25 [ 26 'from_string' => true, 27 'date_string' => 'next weekday', 28 ] 29); 30var_dump($d); 31 32echo "\n\nUsed serialised interval:\n"; 33$now = new DateTimeImmutable("2022-04-22 16:25:11 BST"); 34var_dump($now->add($e)); 35try { 36 var_dump($now->sub($e)); 37} catch (DateInvalidOperationException $e) { 38 echo $e::class, ': ', $e->getMessage(), "\n"; 39} 40?> 41--EXPECTF-- 42Original object: 43object(DateInterval)#1 (%d) { 44 ["from_string"]=> 45 bool(true) 46 ["date_string"]=> 47 string(%d) "next weekday" 48} 49 50 51Serialised object: 52string(%d) "O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:%d:"next weekday";}" 53 54 55Unserialised object: 56object(DateInterval)#2 (2) { 57 ["from_string"]=> 58 bool(true) 59 ["date_string"]=> 60 string(%d) "next weekday" 61} 62 63 64Calling __serialize manually: 65array(2) { 66 ["from_string"]=> 67 bool(true) 68 ["date_string"]=> 69 string(%d) "next weekday" 70} 71 72 73Calling __unserialize manually: 74object(DateInterval)#3 (2) { 75 ["from_string"]=> 76 bool(true) 77 ["date_string"]=> 78 string(%d) "next weekday" 79} 80 81 82Used serialised interval: 83object(DateTimeImmutable)#4 (3) { 84 ["date"]=> 85 string(26) "2022-04-25 16:25:11.000000" 86 ["timezone_type"]=> 87 int(2) 88 ["timezone"]=> 89 string(3) "BST" 90} 91DateInvalidOperationException: DateTimeImmutable::sub(): Only non-special relative time specifications are supported for subtraction 92