-
Notifications
You must be signed in to change notification settings - Fork 82
Expand file tree
/
Copy pathexamples.xml
More file actions
155 lines (149 loc) · 4.96 KB
/
examples.xml
File metadata and controls
155 lines (149 loc) · 4.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: cd8b964b8566801265f0d287db6eb651f93be950 Maintainer: mumumu Status: ready -->
<chapter xml:id="datetime.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="datetime.examples-arithmetic">
<title>日付/時刻 の算術</title>
<para>
以下の例は、DST(夏時間) への移行や、
異なった日を持つ月に関する 日付/時刻 の算術の罠をいくつか紹介します。
</para>
<para>
<example>
<title>DateTimeImmutable::add/sub は、経過時間を含む区間を足してしまう</title>
<simpara>
DST (夏時間) への移行タイミングをまたいで 24時間を足してしまうと、
(ほとんどのタイムゾーンでは) 23/25時間を足しているように見える
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->add(new DateInterval("PT3H"));
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Start: 2015-11-01 00:00:00 -04:00
End: 2015-11-01 02:00:00 -05:00
]]>
</screen>
</example>
</para>
<para>
<example>
<title>DateTimeImmutable::modify と strtotime を使い、個々のコンポーネントの値をインクリメント/デクリメントする</title>
<simpara>
DST (夏時間) の移行のタイミングをまたいで24時間を足すと、日付/時刻 文字列に正確に24時間足されることになります
(開始時刻と終了時刻が同じ移行ポイントにない場合)
point).
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+24 hours");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Start: 2015-11-01 00:00:00 -04:00
End: 2015-11-02 00:00:00 -05:00
]]>
</screen>
</example>
</para>
<para>
<example>
<title>時刻を引き算すると、日付がオーバー/アンダーフローする可能性がある</title>
<simpara>
1月31日 + 1ヶ月 のような計算をすると、(うるう年のときは) 3月2日、
または (通常の年は) 3月3日になります。
</simpara>
<programlisting role="php">
<![CDATA[
<?php
echo "Normal year:\n"; // February has 28 days
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Leap year:\n"; // February has 29 days
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Normal year:
Start: 2015-01-31 00:00:00 -05:00
End: 2015-03-03 00:00:00 -05:00
Leap year:
Start: 2016-01-31 00:00:00 -05:00
End: 2016-03-02 00:00:00 -05:00
]]>
</screen>
<simpara>
次の月の最後の日を得るために(つまり、オーバーフローを避けるため)、
<literal>last day of</literal> フォーマットも利用できます。
</simpara>
<programlisting role="php">
<![CDATA[
<?php
echo "Normal year:\n"; // February has 28 days
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Leap year:\n"; // February has 29 days
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Normal year:
Start: 2015-01-31 00:00:00 -05:00
End: 2015-02-28 00:00:00 -05:00
Leap year:
Start: 2016-01-31 00:00:00 -05:00
End: 2016-02-29 00:00:00 -05:00
]]>
</screen>
</example>
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->