1--TEST--
2Test DateInterval::__serialize and DateInterval::__unserialize
3--FILE--
4<?php
5date_default_timezone_set("Europe/London");
6
7$d1 = new DateTimeImmutable("1978-12-22 09:15 CET");
8$d2 = new DateTimeImmutable("2022-04-15 10:27:27 BST");
9
10$d = $d1->diff($d2);
11echo "Original object:\n";
12var_dump($d);
13
14echo "\n\nSerialised object:\n";
15$s = serialize($d);
16var_dump($s);
17
18echo "\n\nUnserialised object:\n";
19$e = unserialize($s);
20var_dump($e);
21
22echo "\n\nCalling __serialize manually:\n";
23var_dump($d->__serialize());
24
25echo "\n\nCalling __unserialize manually:\n";
26$d = new DateInterval('P2Y4DT6H8M');
27$d->__unserialize(
28	[
29		'y' => 43,
30		'm' =>  3,
31		'd' => 24,
32		'h' =>  1,
33		'i' => 12,
34		's' => 27,
35		'f' => 0.654321,
36		'days' => 15820,
37	]
38);
39var_dump($d);
40
41echo "\n\nUsed serialised interval:\n";
42$now = new DateTimeImmutable("2022-04-15 10:27:27 BST");
43var_dump($now->add($e));
44var_dump($now->sub($e));
45?>
46--EXPECTF--
47Original object:
48object(DateInterval)#3 (10) {
49  ["y"]=>
50  int(43)
51  ["m"]=>
52  int(3)
53  ["d"]=>
54  int(24)
55  ["h"]=>
56  int(1)
57  ["i"]=>
58  int(12)
59  ["s"]=>
60  int(27)
61  ["f"]=>
62  float(0)
63  ["invert"]=>
64  int(0)
65  ["days"]=>
66  int(15820)
67  ["from_string"]=>
68  bool(false)
69}
70
71
72Serialised object:
73string(172) "O:12:"DateInterval":10:{s:1:"y";i:43;s:1:"m";i:3;s:1:"d";i:24;s:1:"h";i:1;s:1:"i";i:12;s:1:"s";i:27;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:15820;s:11:"from_string";b:0;}"
74
75
76Unserialised object:
77object(DateInterval)#4 (10) {
78  ["y"]=>
79  int(43)
80  ["m"]=>
81  int(3)
82  ["d"]=>
83  int(24)
84  ["h"]=>
85  int(1)
86  ["i"]=>
87  int(12)
88  ["s"]=>
89  int(27)
90  ["f"]=>
91  float(0)
92  ["invert"]=>
93  int(0)
94  ["days"]=>
95  int(15820)
96  ["from_string"]=>
97  bool(false)
98}
99
100
101Calling __serialize manually:
102array(%d) {
103  ["y"]=>
104  int(43)
105  ["m"]=>
106  int(3)
107  ["d"]=>
108  int(24)
109  ["h"]=>
110  int(1)
111  ["i"]=>
112  int(12)
113  ["s"]=>
114  int(27)
115  ["f"]=>
116  float(0)
117  ["invert"]=>
118  int(0)
119  ["days"]=>
120  int(15820)
121  ["from_string"]=>
122  bool(false)
123}
124
125
126Calling __unserialize manually:
127object(DateInterval)#5 (10) {
128  ["y"]=>
129  int(43)
130  ["m"]=>
131  int(3)
132  ["d"]=>
133  int(24)
134  ["h"]=>
135  int(1)
136  ["i"]=>
137  int(12)
138  ["s"]=>
139  int(27)
140  ["f"]=>
141  float(0.654321)
142  ["invert"]=>
143  int(0)
144  ["days"]=>
145  int(15820)
146  ["from_string"]=>
147  bool(false)
148}
149
150
151Used serialised interval:
152object(DateTimeImmutable)#6 (3) {
153  ["date"]=>
154  string(26) "2065-08-08 11:39:54.000000"
155  ["timezone_type"]=>
156  int(2)
157  ["timezone"]=>
158  string(3) "BST"
159}
160object(DateTimeImmutable)#6 (3) {
161  ["date"]=>
162  string(26) "1978-12-22 09:15:00.000000"
163  ["timezone_type"]=>
164  int(2)
165  ["timezone"]=>
166  string(3) "BST"
167}
168