reference/datetime/formats.xml
64dc79d6c9710dddf196aa28e3c5f63b562e7aef
...
...
@@ -4,27 +4,147 @@
4
4
<title>Supported Date and Time Formats</title>
5
5

6
6
<para>
7
-
This section describes all the different formats that the
8
-
<function>strtotime</function>, <classname>DateTime</classname>
9
-
and <function>date_create</function> parser understands. The formats
10
-
are grouped by section. In most cases formats from different
11
-
sections can be used in the same date/time string. For each of
12
-
the supported formats, one or more examples are given, as well
7
+
This section describes all the different formats in a BNF-like format, that the
8
+
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
9
+
<function>date_create_immutable</function>,
10
+
<function>date_create</function>, <function>date_parse</function>, and
11
+
<function>strtotime</function> parser understands. The formats are grouped
12
+
by section. In most cases formats from different sections, separated by
13
+
whitespace, comma or dot, can be used in the same date/time string. For each
14
+
of the supported formats, one or more examples are given, as well
13
15
as a description for the format. Characters in single quotes in
14
16
the formats are case-insensitive (<literal>'t'</literal> could
15
17
be <literal>t</literal> or <literal>T</literal>), characters in
16
18
double quotes are case-sensitive (<literal>"T"</literal> is only
17
19
<literal>T</literal>).
18
20
</para>
21
+
<para>
22
+
To format <classname>DateTimeImmutable</classname> and
23
+
<classname>DateTime</classname> objects, please refer to the documentation
24
+
of the <function>DateTimeInterface::format</function> method.
25
+
</para>
26
+

27
+
<para>
28
+
A general set of rules should be taken into account.
29
+
</para>
30
+
<orderedlist>
31
+
<listitem>
32
+
<simpara>
33
+
The parser, allows for each unit (year, month, day, hour, minute, second)
34
+
the full range of values. For a year that's just 4 digits, for a month
35
+
that's 0-12, day is 0-31, hour is 0-24, and minute is 0-59.
36
+
</simpara>
37
+
</listitem>
38
+
<listitem>
39
+
<simpara>
40
+
60 is allowed for seconds, as sometimes date strings with that
41
+
leapsecond do show up. But PHP implements Unix time where "60" is not
42
+
a valid second number and hence it overflows.
43
+
</simpara>
44
+
</listitem>
45
+
<listitem>
46
+
<simpara>
47
+
<function>strtotime</function> returns &false; if any number is outside of
48
+
the ranges, and <function>DateTimeImmutable::__construct</function> throws
49
+
an exception.
50
+
</simpara>
51
+
</listitem>
52
+
<listitem>
53
+
<simpara>
54
+
If a string contains a date, all time elements are reset to 0.
55
+
</simpara>
56
+
</listitem>
57
+
<listitem>
58
+
<simpara>
59
+
All less-significant time elements are reset to 0 if any part of a time is
60
+
present in the given string.
61
+
</simpara>
62
+
</listitem>
63
+
<listitem>
64
+
<simpara>
65
+
The parser is dumb, and doesn't do any checks to make it faster (and
66
+
more generic).
67
+
</simpara>
68
+
</listitem>
69
+
<listitem>
70
+
<simpara>
71
+
Besides rules for individual time elements, the parser also understand
72
+
more specific <link linkend="datetime.formats.compound">compound
73
+
formats</link>, such as parsing Unix timestamps
74
+
(<literal>@1690388256</literal>) and ISO Weekdates
75
+
(<literal>2008-W28-3</literal>).
76
+
</simpara>
77
+
</listitem>
78
+
<listitem>
79
+
<para>
80
+
There is an additional check if an invalid date is provided:
81
+
<informalexample>
82
+
<programlisting role="php">
83
+
<![CDATA[
84
+
<?php
85
+
$res = date_parse("2015-09-31");
86
+
var_dump($res["warnings"]);
87
+
?>
88
+
]]>
89
+
</programlisting>
90
+
&example.outputs;
91
+
<screen>
92
+
<![CDATA[
93
+
array(1) {
94
+
[11] =>
95
+
string(27) "The parsed date was invalid"
96
+
}
97
+
]]>
98
+
</screen>
99
+
</informalexample>
100
+
</para>
101
+
</listitem>
102
+
<listitem>
103
+
<para>
104
+
It is already possible to handle the edge cases, but then
105
+
<function>DateTimeImmutable::createFromFormat</function> must be used
106
+
while supplying the correct format.
107
+
<informalexample>
108
+
<programlisting role="php">
109
+
<![CDATA[
110
+
<?php
111
+
$res = DateTimeImmutable::createFromFormat("Y-m-d", "2015-09-34");
112
+
var_dump($res);
113
+
]]>
114
+
</programlisting>
115
+
&example.outputs;
116
+
<screen>
117
+
<![CDATA[
118
+
object(DateTimeImmutable)#1 (3) {
119
+
["date"]=>
120
+
string(26) "2015-10-04 17:24:43.000000"
121
+
["timezone_type"]=>
122
+
int(3)
123
+
["timezone"]=>
124
+
string(13) "Europe/London"
125
+
}
126
+
]]>
127
+
</screen>
128
+
</informalexample>
129
+
</para>
130
+
</listitem>
131
+
</orderedlist>
19
132

20
133
<!--Time Formats: {{{-->
21
-
<sect1 xml:id="datetime.formats.time">
134
+
<sect1 annotations="chunk:false" xml:id="datetime.formats.time">
22
135
<title>Time Formats</title>
23
136

24
137
<para>
25
-
This page describes the different time formats that the
26
-
<function>strtotime</function>, <classname>DateTime</classname> and
27
-
<function>date_create</function> parser understands.
138
+
This page describes the different date/time formats in a BNF-like syntax,
139
+
that the <classname>DateTimeImmutable</classname>,
140
+
<classname>DateTime</classname>, <function>date_create</function>,
141
+
<function>date_create_immutable</function>, and
142
+
<function>strtotime</function> parser understands.
143
+
</para>
144
+
<para>
145
+
To format <classname>DateTimeImmutable</classname> and
146
+
<classname>DateTime</classname> objects, please refer to the documentation
147
+
of the <function>DateTimeInterface::format</function> method.
28
148
</para>
29
149

30
150
<table>
...
...
@@ -51,7 +171,7 @@
51
171
<row>
52
172
<entry><literal>HH</literal></entry>
53
173
<entry>[01][0-9] | "2"[0-4]</entry>
54
-
<entry>"04", "7", "19"</entry>
174
+
<entry>"04", "07", "19"</entry>
55
175
</row>
56
176
<row>
57
177
<entry><literal>meridian</literal></entry>
...
...
@@ -114,7 +234,7 @@
114
234
<entry>"4:08:37 am", "7:19:19P.M."</entry>
115
235
</row>
116
236
<row>
117
-
<entry>MS SQL (Hour, minutes, seconds and fraction with meridian), PHP 5.3 and later only</entry>
237
+
<entry>MS SQL (Hour, minutes, seconds and fraction with meridian)</entry>
118
238
<entry><literal>hh</literal> ":" <literal>MM</literal> ":" <literal>II</literal> [.:] [0-9]+ <literal>meridian</literal></entry>
119
239
<entry>"4:08:39:12313am"</entry>
120
240
</row>
...
...
@@ -175,13 +295,20 @@
175
295
<!--}}}-->
176
296

177
297
<!--Date Formats: {{{-->
178
-
<sect1 xml:id="datetime.formats.date">
298
+
<sect1 annotations="chunk:false" xml:id="datetime.formats.date">
179
299
<title>Date Formats</title>
180
300

181
301
<para>
182
-
This page describes the different date formats that the
183
-
<function>strtotime</function>, <classname>DateTime</classname> and
184
-
<function>date_create</function> parser understands.
302
+
This page describes the different date formats in a BNF-like syntax, that
303
+
the <classname>DateTimeImmutable</classname>,
304
+
<classname>DateTime</classname>, <function>date_create</function>,
305
+
<function>date_create_immutable</function>, and
306
+
<function>strtotime</function> parser understands.
307
+
</para>
308
+
<para>
309
+
To format <classname>DateTimeImmutable</classname> and
310
+
<classname>DateTime</classname> objects, please refer to the documentation
311
+
of the <function>DateTimeInterface::format</function> method.
185
312
</para>
186
313

187
314
<table>
...
...
@@ -250,6 +377,11 @@
250
377
<entry>[0-9]{4}</entry>
251
378
<entry>"2000", "2008", "1978"</entry>
252
379
</row>
380
+
<row>
381
+
<entry><literal>YYY</literal></entry>
382
+
<entry>[0-9]{5,19}</entry>
383
+
<entry>"81412", "20192"</entry>
384
+
</row>
253
385
</tbody>
254
386
</tgroup>
255
387
</table>
...
...
@@ -327,7 +459,7 @@
327
459
</row>
328
460
<row>
329
461
<entry>Day and textual month</entry>
330
-
<entry><literal>d</literal> ([ .\t-])* <literal>m</literal></entry>
462
+
<entry><literal>dd</literal> ([ .\t-])* <literal>m</literal></entry>
331
463
<entry>"1 July", "17 Apr", "9.May"</entry>
332
464
</row>
333
465
<row>
...
...
@@ -345,6 +477,11 @@
345
477
<entry><literal>YY</literal></entry>
346
478
<entry>"1978", "2008"</entry>
347
479
</row>
480
+
<row>
481
+
<entry>Year (expanded, 5-19 digits with sign)</entry>
482
+
<entry>[+-] <literal>YYY</literal></entry>
483
+
<entry>"-81120", "+20192"</entry>
484
+
</row>
348
485
<row>
349
486
<entry>Textual month (and just the month)</entry>
350
487
<entry><literal>m</literal></entry>
...
...
@@ -385,6 +522,11 @@
385
522
<entry>[+-]? <literal>YY</literal> "-" <literal>MM</literal> "-" <literal>DD</literal></entry>
386
523
<entry>"-0002-07-26", "+1978-04-17", "1814-05-17"</entry>
387
524
</row>
525
+
<row>
526
+
<entry>Five+ digit year with required sign, month and day</entry>
527
+
<entry>[+-] <literal>YYY</literal> "-" <literal>MM</literal> "-" <literal>DD</literal></entry>
528
+
<entry>"-81120-02-26", "+20192-04-17"</entry>
529
+
</row>
388
530
</tbody>
389
531
</tgroup>
390
532
</table>
...
...
@@ -414,13 +556,19 @@
414
556

415
557
<note>
416
558
<para>
417
-
The "Year (and just the year)" format only works if a time string
418
-
has already been found -- otherwise this format is recognised as
419
-
<literal>HH</literal> <literal>MM</literal>.
559
+
The "Year (and just the year)" format only reliably works if a time string
560
+
has already been found. Otherwise, if the four digit year matches
561
+
<literal>HH</literal> <literal>MM</literal> then these two date elements
562
+
are set instead.
563
+
</para>
564
+
<para>
565
+
To consistently parse just a year, use
566
+
<function>DateTimeImmutable::createFromFormat</function> with the
567
+
<literal>Y</literal> specifier.
420
568
</para>
421
569
</note>
422
570

423
-
<note>
571
+
<caution>
424
572
<para>
425
573
It is possible to over- and underflow the <literal>dd</literal> and
426
574
<literal>DD</literal> format. Day 0 means the last day of previous
...
...
@@ -428,6 +576,11 @@
428
576
"2008-08-00" equivalent to "2008-07-31" and "2008-06-31" equivalent
429
577
to "2008-07-01" (June only has 30 days).
430
578
</para>
579
+
<para>
580
+
Note that the day range is restricted to 0-31 as indicated
581
+
by the regular expression above. Thus "2008-06-32" is not a valid date
582
+
string, for instance.
583
+
</para>
431
584
<para>
432
585
It is also possible to underflow the <literal>mm</literal> and
433
586
<literal>MM</literal> formats with the value 0. A month value of
...
...
@@ -442,18 +595,25 @@
442
595
"-0001-11-30" (the year -1 in the ISO 8601 calendar, which is 2 BC
443
596
in the proleptic Gregorian calendar).
444
597
</para>
445
-
</note>
598
+
</caution>
446
599
</sect1>
447
600
<!--}}}-->
448
601

449
602
<!--Compound Formats: {{{-->
450
-
<sect1 xml:id="datetime.formats.compound">
603
+
<sect1 annotations="chunk:false" xml:id="datetime.formats.compound">
451
604
<title>Compound Formats</title>
452
605

453
606
<para>
454
-
This page describes the different compound date/time formats that the
455
-
<function>strtotime</function>, <classname>DateTime</classname> and
456
-
<function>date_create</function> parser understands.
607
+
This page describes the different compound date/time formats in a BNF-like
608
+
syntax, that the <classname>DateTimeImmutable</classname>,
609
+
<classname>DateTime</classname>, <function>date_create</function>,
610
+
<function>date_create_immutable</function>, and
611
+
<function>strtotime</function> parser understands.
612
+
</para>
613
+
<para>
614
+
To format <classname>DateTimeImmutable</classname> and
615
+
<classname>DateTime</classname> objects, please refer to the documentation
616
+
of the <function>DateTimeInterface::format</function> method.
457
617
</para>
458
618

459
619
<table>
...
...
@@ -490,7 +650,7 @@
490
650
<row>
491
651
<entry><literal>HH</literal></entry>
492
652
<entry>[01][0-9] | "2"[0-4]</entry>
493
-
<entry>"04", "7", "19"</entry>
653
+
<entry>"04", "07", "19"</entry>
494
654
</row>
495
655
<row>
496
656
<entry><literal>meridian</literal></entry>
...
...
@@ -499,7 +659,7 @@
499
659
</row>
500
660
<row>
501
661
<entry><literal>ii</literal></entry>
502
-
<entry>[0-5][0-9]</entry>
662
+
<entry>[0-5]?[0-9]</entry>
503
663
<entry>"04", "8", "59"</entry>
504
664
</row>
505
665
<row>
...
...
@@ -524,8 +684,8 @@
524
684
</row>
525
685
<row>
526
686
<entry><literal>ss</literal></entry>
527
-
<entry>[0-5][0-9]</entry>
528
-
<entry>"04", "8", "59"</entry>
687
+
<entry>([0-5]?[0-9])|60</entry>
688
+
<entry>"04", "8", "59", "60" (leap second)</entry>
529
689
</row>
530
690
<row>
531
691
<entry><literal>SS</literal></entry>
...
...
@@ -551,6 +711,72 @@
551
711
</tgroup>
552
712
</table>
553
713

714
+
<table>
715
+
<title>Standards Formats</title>
716
+
<tgroup cols="2">
717
+
<thead>
718
+
<row>
719
+
<entry>Description</entry>
720
+
<entry>Examples</entry>
721
+
</row>
722
+
</thead>
723
+
<tbody>
724
+
<row>
725
+
<entry>ATOM</entry>
726
+
<entry>"2022-06-02T16:58:35+00:00"</entry>
727
+
</row>
728
+
<row>
729
+
<entry>COOKIE</entry>
730
+
<entry>"Thursday, 02-Jun-2022 16:58:35 UTC"</entry>
731
+
</row>
732
+
<row>
733
+
<entry>ISO8601</entry>
734
+
<entry>"2022-06-02T16:58:35+0000"</entry>
735
+
</row>
736
+
<row>
737
+
<entry><link xlink:href="&url.rfc;822">RFC 822</link></entry>
738
+
<entry>"Thu, 02 Jun 22 16:58:35 +0000"</entry>
739
+
</row>
740
+
<row>
741
+
<entry><link xlink:href="&url.rfc;850">RFC 850</link></entry>
742
+
<entry>"Thursday, 02-Jun-22 16:58:35 UTC"</entry>
743
+
</row>
744
+
<row>
745
+
<entry><link xlink:href="&url.rfc;1036">RFC 1036</link></entry>
746
+
<entry>"Thu, 02 Jun 22 16:58:35 +0000"</entry>
747
+
</row>
748
+
<row>
749
+
<entry><link xlink:href="&url.rfc;1123">RFC 1123</link></entry>
750
+
<entry>"Thu, 02 Jun 2022 16:58:35 +0000"</entry>
751
+
</row>
752
+
<row>
753
+
<entry><link xlink:href="&url.rfc;2822">RFC 2822</link></entry>
754
+
<entry>"Thu, 02 Jun 2022 16:58:35 +0000"</entry>
755
+
</row>
756
+
<row>
757
+
<entry><link xlink:href="&url.rfc;3339">RFC 3339</link></entry>
758
+
<entry>"2022-06-02T16:58:35+00:00"</entry>
759
+
</row>
760
+
<row>
761
+
<entry><link xlink:href="&url.rfc;3339">RFC 3339</link> Extended</entry>
762
+
<entry>"2022-06-02T16:58:35.698+00:00"</entry>
763
+
</row>
764
+
<row>
765
+
<entry><link xlink:href="&url.rfc;7231">RFC 7231</link></entry>
766
+
<entry>"Thu, 02 Jun 2022 16:58:35 GMT"</entry>
767
+
</row>
768
+
<row>
769
+
<entry>RSS</entry>
770
+
<entry>"Thu, 02 Jun 2022 16:58:35 +0000"</entry>
771
+
</row>
772
+
<row>
773
+
<entry>W3C</entry>
774
+
<entry>"2022-06-02T16:58:35+00:00"</entry>
775
+
</row>
776
+
</tbody>
777
+
</tgroup>
778
+
</table>
779
+

554
780
<table>
555
781
<title>Localized Notations</title>
556
782
<tgroup cols="3">
...
...
@@ -602,6 +828,11 @@
602
828
<entry>"@" "-"? [0-9]+</entry>
603
829
<entry>"@1215282385"</entry>
604
830
</row>
831
+
<row>
832
+
<entry>Unix Timestamp with microseconds</entry>
833
+
<entry>"@" "-"? [0-9]+ "." [0-9]{0,6}</entry>
834
+
<entry>"@1607974647.503686"</entry>
835
+
</row>
605
836
<row>
606
837
<entry>XMLRPC</entry>
607
838
<entry><literal>YY</literal> <literal>MM</literal> <literal>DD</literal> "T" <literal>hh</literal> ":" <literal>II</literal> ":" <literal>SS</literal></entry>
...
...
@@ -628,7 +859,7 @@
628
859
"W".
629
860
</para>
630
861
<para>
631
-
The "T" in the SOAP, XMRPC and WDDX formats is case-sensitive, you
862
+
The "T" in the SOAP, XMLRPC and WDDX formats is case-sensitive, you
632
863
can only use the upper case "T".
633
864
</para>
634
865
<para>
...
...
@@ -639,12 +870,19 @@
639
870
<!--}}}-->
640
871

641
872
<!--Relative Formats: {{{-->
642
-
<sect1 xml:id="datetime.formats.relative">
873
+
<sect1 annotations="chunk:false" xml:id="datetime.formats.relative">
643
874
<title>Relative Formats</title>
644
875
<para>
645
-
This page describes the different relative date/time formats that the
646
-
<function>strtotime</function>, <classname>DateTime</classname> and
647
-
<function>date_create</function> parser understands.
876
+
This page describes the different relative date/time formats in a BNF-like
877
+
syntax, that the <classname>DateTimeImmutable</classname>,
878
+
<classname>DateTime</classname>, <function>date_create</function>,
879
+
<function>date_create_immutable</function>, and
880
+
<function>strtotime</function> parser understands.
881
+
</para>
882
+
<para>
883
+
To format <classname>DateTimeImmutable</classname> and
884
+
<classname>DateTime</classname> objects, please refer to the documentation
885
+
of the <function>DateTimeInterface::format</function> method.
648
886
</para>
649
887

650
888
<table>
...
...
@@ -687,9 +925,10 @@
687
925
</row>
688
926
<row>
689
927
<entry><literal>unit</literal></entry>
690
-
<entry>(('sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' |
691
-
'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' |
692
-
<literal>daytext</literal></entry>
928
+
<entry>'ms' | 'µs' | (( 'msec' | 'millisecond' | 'µsec' | 'microsecond'
929
+
| 'usec' | 'sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' |
930
+
'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' |
931
+
<literal>daytext</literal></entry>
693
932
</row>
694
933
</tbody>
695
934
</tgroup>
...
...
@@ -749,13 +988,15 @@
749
988
<row>
750
989
<entry>'first day of'</entry>
751
990
<entry>Sets the day of the first of the current month. This phrase is
752
-
best used together with a month name following it.</entry>
991
+
usually best used together with a month name following it as it only
992
+
effects the current month</entry>
753
993
<entry>"first day of January 2008"</entry>
754
994
</row>
755
995
<row>
756
996
<entry>'last day of'</entry>
757
997
<entry>Sets the day to the last day of the current month. This phrase is
758
-
best used together with a month name following it.</entry>
998
+
usually best used together with a month name following it as it only
999
+
effects the current month</entry>
759
1000
<entry>"last day of next month"</entry>
760
1001
</row>
761
1002
<row>
...
...
@@ -774,9 +1015,12 @@
774
1015
<entry>"+5 weeks", "12 day", "-7 weekdays"</entry>
775
1016
</row>
776
1017
<row>
777
-
<entry><literal>ordinal</literal> <literal>space</literal> <literal>unit</literal></entry>
778
-
<entry>Handles relative time items where the value is text.</entry>
779
-
<entry>"fifth day", "second month"</entry>
1018
+
<entry>(<literal>ordinal</literal> | <literal>reltext</literal>) <literal>space</literal> <literal>unit</literal></entry>
1019
+
<entry>Handles relative time items where the value is text.
1020
+
<literal>last</literal> and <literal>previous</literal> are equivalent
1021
+
to <literal>-1</literal>, <literal>this</literal> to nothing, and
1022
+
<literal>next</literal> to <literal>+1</literal>.</entry>
1023
+
<entry>"fifth day", "second month", "last day", "previous year"</entry>
780
1024
</row>
781
1025
<row>
782
1026
<entry>'ago'</entry>
...
...
@@ -785,7 +1029,10 @@
785
1029
</row>
786
1030
<row>
787
1031
<entry><literal>dayname</literal></entry>
788
-
<entry>Moves to the next day of this name.</entry>
1032
+
<entry>
1033
+
Moves to the next day of this name. (See <link
1034
+
linkend="datetime.formats.relative.dayname-note">note</link>)
1035
+
</entry>
789
1036
<entry>"Monday"</entry>
790
1037
</row>
791
1038
<row>
...
...
@@ -811,10 +1058,18 @@
811
1058
produces "2008-07-24 00:00". The reason for this is that those
812
1059
five statements directly influence the current time.
813
1060
</para>
1061
+
<para>
1062
+
Keywords such as "first day of" depend on the context in which the
1063
+
relative format string is used. If used with a static method or function,
1064
+
the referent is the current system timestamp. However, if used in
1065
+
<function>DateTime::modify</function> or
1066
+
<function>DateTimeImmutable::modify</function>, the referent is the object
1067
+
on which the <literal>modify()</literal> method is called.
1068
+
</para>
814
1069
</note>
815
1070

816
1071
<note>
817
-
<para>
1072
+
<para xml:id="datetime.formats.relative.dayname-note">
818
1073
Observe the following remarks when the current day-of-week is the
819
1074
same as the day-of-week used in the date/time string. The current
820
1075
day-of-week could have been (re-)calculated by non-relative parts of
...
...
@@ -925,6 +1180,14 @@
925
1180
December being 31 days in length, producing a total of 61 days.
926
1181
</para>
927
1182
</note>
1183
+
<note>
1184
+
<para>
1185
+
<literal>number</literal> is an <emphasis>integer</emphasis> number; if a
1186
+
decimal number is given, the dot (or comma) is likely interpreted as delimiter.
1187
+
For instance, <literal>'+1.5 hours'</literal> is parsed like
1188
+
<literal>'+1 5 hours'</literal>, not as <literal>'+1 hour +30 minutes'</literal>.
1189
+
</para>
1190
+
</note>
928
1191

929
1192
<sect2 role="changelog">
930
1193
&reftitle.changelog;
...
...
@@ -939,10 +1202,25 @@
939
1202
</thead>
940
1203
<tbody>
941
1204
<row>
942
-
<entry>5.3.3</entry>
1205
+
<entry>8.4.0</entry>
1206
+
<entry>
1207
+
<literal>number</literal> now again accepts a plus sign followed by a
1208
+
minus sign, e.g. <literal>+-2</literal>, and other combinations of
1209
+
multiple signs.
1210
+
</entry>
1211
+
</row>
1212
+
<row>
1213
+
<entry>8.2.0</entry>
1214
+
<entry>
1215
+
<literal>number</literal> no longer accepts a plus sign followed by a
1216
+
minus sign, e.g. <literal>+-2</literal>.
1217
+
</entry>
1218
+
</row>
1219
+
<row>
1220
+
<entry>7.0.8</entry>
943
1221
<entry>
944
-
"first day" and "last day" changed to behave has "+1 day" and "-1 day",
945
-
respectively. Previously, the behaviour was as "first day of" and "last day of".
1222
+
Weeks always start on monday. Formerly, sunday would also be considered
1223
+
to start a week.
946
1224
</entry>
947
1225
</row>
948
1226
</tbody>
949
1227