Julia. TimeZones, manipulation de dates au format ISO long.

Le système de gestion des dates de Julia offre de nombreuses possibilités, mais ce n'est pas un modèle de simplicité.

Il y a Dates, Time, DateTime et TimeZones.

Le format ISO long est géré par la méthode ZonedDateTime de TimesZones.

Rappel, le format ISO long est : yyyy-mm-ddTHH:MM:SS.ssszz

using Dates, TimeZones

now() |> println # DateTime
ZonedDateTime(now(), tz"Europe/Brussels") |> println # TimeZones;
2021-01-25T20:14:44.588
2021-01-25T20:14:44.947+01:00

ZonedDateTime ne trouve aucun mal à abréger les microsecondes, ce qui donne .5 au lieu de .500 millisecondes et ne facilite pas la conversion en DateTime.

ZonedDateTime(DateTime(2021, 1, 8, 17, 55, 33, 500), tz"Asia/Shanghai") |> println
2021-01-08T17:55:33.5+08:00

DateTime peut convertir un ZonedDateTime sans soucis uniquement s'il est au format ISO long : yyyy-mm-ddTHH:MM:SS.sssZZ

t1 = "2021-01-08T17:55:33.5+01:00"
# ZonedDateTime(DateTime(t1)) # produira un ArgumentError: Invalid DateTime string

t2 = "2021-01-08T17:55:33+01:00"
# ZonedDateTime(DateTime(t2)) # produira un ArgumentError: Invalid DateTime string

# Pour réaliser la conversion il faut connaître le format réel

ZonedDateTime(DateTime(t2, "yyyy-mm-ddTHH:MM:SSzz"), tz"Europe/Brussels") |> println
ZonedDateTime(DateTime(t1, "yyyy-mm-ddTHH:MM:SS.szz"), tz"Europe/Brussels") |> println
2021-01-08T17:55:33+01:00
2021-01-08T17:55:33.5+01:00

Le comportement de ZonedDateTime est catastrophique lorsque vous sauvegarder les ZonedDateTime dans un fichier, car lorsque vous ouvrer ce fichier et essayer de traiter les dates sauvegardées le format de la date va poser le problème traiter ci-dessus pour chaque enregistrement de la date.

Recommendation : lorsque vous devez enregistrer des dates dans un fichier ce doit être dans le format DateTime ("yyyy-mm-ddTHH:MM:SS") ou sans microsecondes ("yyyy-mm-ddTHH:MM:SSzz") avec round() voir ci-dessous.

On peut convertir une date dans un autre fuseau horaire.

ny = "01/01/2021 06:31:33 PM" # heure de New-Yok

dt_ny = DateTime(ny, "mm/dd/yyyy H:M:S p")
zdt_ny = ZonedDateTime(dt_ny, tz"America/New_york")

dt_ny |> println
zdt_ny |> println
astimezone(zdt_ny, tz"UTC") |> println
astimezone(zdt_ny, tz"Europe/Brussels") |> println
astimezone(zdt_ny, tz"Asia/Shanghai") |> println # Beijing Time
2021-01-01T18:31:33
2021-01-01T18:31:33-05:00
2021-01-01T23:31:33+00:00
2021-01-02T00:31:33+01:00
2021-01-02T07:31:33+08:00

Conversions et arithmétique

zdt_br = now(tz"Europe/Brussels")

zdt_br |> println
"\n" |> println

Date(zdt_br) |> println
Date(zdt_br, UTC) |> println
"\n" |> println

Time(zdt_br) |> println
Time(zdt_br, UTC) |> println
"\n" |> println

zdt_br + Day(12) + Hour(5) |> println
"\n" |> println

round(zdt_br, Dates.Second) |> println # on dispose aussi de floor et ceil
2021-01-25T20:14:45.748+01:00


2021-01-25
2021-01-25


20:14:45.748
19:14:45.748


2021-02-07T01:14:45.748+01:00


2021-01-25T20:14:46+01:00

Ranges

tz_br = tz"Europe/Brussels"
start = ZonedDateTime(2014, tz_br)
stop = ZonedDateTime(2015, tz_br)

br_dates = filter(start:Dates.Hour(1):stop) do d
    Dates.dayofweek(d) == Dates.Wednesday && Dates.hour(d) == 9
end

length(br_dates) |> println
br_dates |> println
53
[TimeZones.ZonedDateTime(2014, 1, 1, 9, tz"Europe/Brussels"), TimeZones.Zon
edDateTime(2014, 1, 8, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(201
4, 1, 15, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 1, 22, 9, 
tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 1, 29, 9, tz"Europe/Bru
ssels"), TimeZones.ZonedDateTime(2014, 2, 5, 9, tz"Europe/Brussels"), TimeZ
ones.ZonedDateTime(2014, 2, 12, 9, tz"Europe/Brussels"), TimeZones.ZonedDat
eTime(2014, 2, 19, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 2
, 26, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 3, 5, 9, tz"Eu
rope/Brussels"), TimeZones.ZonedDateTime(2014, 3, 12, 9, tz"Europe/Brussels
"), TimeZones.ZonedDateTime(2014, 3, 19, 9, tz"Europe/Brussels"), TimeZones
.ZonedDateTime(2014, 3, 26, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTim
e(2014, 4, 2, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 4, 9, 
9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 4, 16, 9, tz"Europe/
Brussels"), TimeZones.ZonedDateTime(2014, 4, 23, 9, tz"Europe/Brussels"), T
imeZones.ZonedDateTime(2014, 4, 30, 9, tz"Europe/Brussels"), TimeZones.Zone
dDateTime(2014, 5, 7, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014
, 5, 14, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 5, 21, 9, t
z"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 5, 28, 9, tz"Europe/Brus
sels"), TimeZones.ZonedDateTime(2014, 6, 4, 9, tz"Europe/Brussels"), TimeZo
nes.ZonedDateTime(2014, 6, 11, 9, tz"Europe/Brussels"), TimeZones.ZonedDate
Time(2014, 6, 18, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 6,
 25, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 7, 2, 9, tz"Eur
ope/Brussels"), TimeZones.ZonedDateTime(2014, 7, 9, 9, tz"Europe/Brussels")
, TimeZones.ZonedDateTime(2014, 7, 16, 9, tz"Europe/Brussels"), TimeZones.Z
onedDateTime(2014, 7, 23, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(
2014, 7, 30, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 8, 6, 9
, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 8, 13, 9, tz"Europe/B
russels"), TimeZones.ZonedDateTime(2014, 8, 20, 9, tz"Europe/Brussels"), Ti
meZones.ZonedDateTime(2014, 8, 27, 9, tz"Europe/Brussels"), TimeZones.Zoned
DateTime(2014, 9, 3, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014,
 9, 10, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 9, 17, 9, tz
"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 9, 24, 9, tz"Europe/Bruss
els"), TimeZones.ZonedDateTime(2014, 10, 1, 9, tz"Europe/Brussels"), TimeZo
nes.ZonedDateTime(2014, 10, 8, 9, tz"Europe/Brussels"), TimeZones.ZonedDate
Time(2014, 10, 15, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 1
0, 22, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 10, 29, 9, tz
"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 11, 5, 9, tz"Europe/Bruss
els"), TimeZones.ZonedDateTime(2014, 11, 12, 9, tz"Europe/Brussels"), TimeZ
ones.ZonedDateTime(2014, 11, 19, 9, tz"Europe/Brussels"), TimeZones.ZonedDa
teTime(2014, 11, 26, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014,
 12, 3, 9, tz"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 12, 10, 9, t
z"Europe/Brussels"), TimeZones.ZonedDateTime(2014, 12, 17, 9, tz"Europe/Bru
ssels"), TimeZones.ZonedDateTime(2014, 12, 24, 9, tz"Europe/Brussels"), Tim
eZones.ZonedDateTime(2014, 12, 31, 9, tz"Europe/Brussels")]

Licence Creative Commons Attribution 2.0 Belgique