Skip to content

Commit 148f07a

Browse files
committed
datetime: timezone support
Closes #2886
1 parent dbee43e commit 148f07a

File tree

1 file changed

+88
-5
lines changed

1 file changed

+88
-5
lines changed

doc/reference/reference_lua/datetime.rst

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Below is a list of ``datetime`` functions, properties, and related objects.
5050
-
5151

5252
* - :ref:`datetime.TZ <datetime-tz>`
53-
- An array of timezone names and abbreviations
53+
- A Lua table that maps timezone names and abbreviations to its index and vice-versa.
5454

5555
* - **Methods**
5656
-
@@ -327,7 +327,8 @@ Functions
327327
- 1970-01-01T03:00:00.125+0300
328328
...
329329
330-
tarantool> dt = datetime.parse('01:01:01', {format ='%H:%M:%S'})
330+
tarantool> dt = datetime.parse('01:01:01 MSK', {format ='%H:%M:%S %Z'})
331+
331332
---
332333
...
333334
@@ -346,6 +347,11 @@ Functions
346347
- 5
347348
...
348349
350+
tarantool> dt.tz
351+
---
352+
- MSK
353+
...
354+
349355
.. _datetime-interval-is_interval:
350356

351357
.. function:: datetime.interval.is_interval([value])
@@ -497,9 +503,20 @@ Properties
497503

498504
Since: :doc:`2.11.0 </release/2.11.0>`
499505

500-
An array of timezone names and abbreviations.
506+
A Lua table that maps timezone names (like ``Europe/Moscow``) and
507+
timezone abbreviations (like ``MSK``) to its index and vice-versa.
501508

509+
.. code-block:: tarantoolsession
502510
511+
tarantool> datetime.TZ['Europe/Moscow']
512+
---
513+
- 947
514+
...
515+
516+
tarantool> datetime.TZ[947]
517+
---
518+
- Europe/Moscow
519+
...
503520
504521
.. _datetime-module-api-reference-objects:
505522

@@ -522,6 +539,8 @@ datetime_object
522539
Modify an existing datetime object by adding values of the input argument.
523540
See also: :ref:`interval_arithm`.
524541

542+
При вычислении :add/:sub и установленном tzindex вычисление производится с учётом tzdata.
543+
525544
:param table input: an :ref:`interval object <interval_obj>` or an equivalent table (see **Example #1**)
526545
:param string adjust: defines how to round days in a month after an arithmetic operation.
527546
Possible values: ``none``, ``last``, ``excess`` (see **Example #2**). Defaults to ``none``.
@@ -703,6 +722,8 @@ datetime_object
703722
Modify an existing datetime object by subtracting values of the input argument.
704723
See also: :ref:`interval_arithm`.
705724

725+
При вычислении :add/:sub и установленном tzindex вычисление производится с учётом tzdata.
726+
706727
:param table input: an :ref:`interval object <interval_obj>` or an equivalent table (see **Example**)
707728
:param string adjust: defines how to round days in a month after an arithmetic operation.
708729
Possible values: ``none``, ``last``, ``excess``. Defaults to ``none``.
@@ -789,10 +810,14 @@ datetime_object
789810
- Days since the beginning of the year
790811

791812
* - isdst
792-
- Is the DST (Daylight saving time) applicable for the date. Boolean.
813+
- Is the DST (Daylight Saving Time) applicable for the date,
814+
see a section :ref:`timezone <timezone>`. Boolean.
793815

794816
* - tzoffset
795-
- Time zone offset from UTC
817+
- Time zone offset from UTC, see a section :ref:`timezone <timezone>`. Number.
818+
819+
* - tz
820+
- Time zone name or abbreviation, see a section :ref:`timezone <timezone>`. String.
796821

797822
:return: table with the date and time parameters
798823
:rtype: table
@@ -1080,11 +1105,69 @@ This section describes how the ``datetime`` module supports leap seconds:
10801105
- 1970-01-01T00:01:00Z
10811106
...
10821107
1108+
.. _timezone:
1109+
1110+
Time zones
1111+
----------
1112+
1113+
Full support has been added since :doc:`2.11.0 </release/2.11.0>`.
1114+
1115+
Tarantool uses `Time Zone Database <https://www.iana.org/time-zones>`__
1116+
(also known as Olson database and supported by IANA) for timezone support.
1117+
You can use the Lua module :ref:`tarantool <tarantool-module>` to get a used version of ``tzdata``.
1118+
1119+
Every datetime object has three fields that represents timezone support:
1120+
``tz``, ``tzoffset`` and ``isdst``:
1121+
1122+
* The field ``isdst`` is calculated using tzindex and attributes of the selected
1123+
timezone in the Olson DB timezone.
1124+
1125+
.. code-block:: tarantoolsession
1126+
1127+
tarantool> require('datetime').parse('2004-06-01T00:00 Europe/Moscow').isdst
1128+
---
1129+
- true
1130+
...
1131+
1132+
* The field ``tz`` field can be set to timezone name or timezone abbreviation. Timezone name
1133+
is a human-readable timezone names, basing on the Time Zone Database, for example "Europe/Moscow".
1134+
Timezone abbreviation represents time zones by `alphabetic abbreviations <https://www.timeanddate.com/time/zones/>`__
1135+
such as "EST", "WST", and "CST". Both timezone names and abbreviations are available
1136+
via bidirectional array :ref:`datetime.TZ <datetime-tz>`.
1137+
1138+
* The field ``tzoffset`` is calculated automatically using current Olson rule i.e.
1139+
it would take into consideration summer time, leap year and leap seconds information
1140+
when timezone name is set. However, field ``tzoffset`` can be set manually when appropriate timezone
1141+
is not available.
1142+
1143+
The fields ``tz``, ``tzoffset`` can be set :ref:`datetime.new() <datetime-new>`,
1144+
:ref:`datetime.parse() <datetime-parse>` and :ref:`datetime_object:set() <datetime-set>`.
1145+
10831146
Limitations
10841147
-----------
10851148

10861149
The supported date range is from ``-5879610-06-22`` to ``+5879611-07-11``.
10871150

1151+
There were moments in a past history, when local mean time in some partcular zone
1152+
used timezone offset not representable in a whole minutes, but rather in seconds,
1153+
i.e. in Moscow before 1918 there used to be offset +2 hours 31 minutes and 19 seconds.
1154+
Please see Olson dump for this period:
1155+
1156+
.. code-block:: console
1157+
1158+
$ ./src/lib/tzcode/install/usr/bin/zdump -c1880,1918 -i Europe/Moscow
1159+
1160+
TZ="Europe/Moscow"
1161+
- - +023017 MMT
1162+
1916-07-03 00:01:02 +023119 MMT
1163+
1917-07-02 00 +033119 MST 1
1164+
1917-12-27 23 +023119 MMT
1165+
1166+
Modern ``tzdata`` rules do not use such tiny fraction, and all timezones differ
1167+
to UTC in units measured in minutes, not seconds. Tarantool datetime module uses
1168+
minutes internally as units for ``tzoffset`` so there is some loss of precision
1169+
if you try to operate with such ancient timestamps.
1170+
10881171
References
10891172
----------
10901173

0 commit comments

Comments
 (0)