links-lang / links

Links: Linking Theory to Practice for the Web
http://www.links-lang.org
Other
318 stars 42 forks source link

dateToInt -> intToDate does not roundtrip depending on time zone #1159

Open darrenldl opened 1 year ago

darrenldl commented 1 year ago

Hello,

Context

I am the main developer of Timedesc - a modern alternative to calendar essentially, and I was poking around at packages which depend on calendar out of curiosity to see if it causes issue in other packages (there have been known issues in ISO8601.ml etc).

(Interesting language! I like the language design quite a lot.)

Problem

For time zones outside of UTC, conversion from date time to timestamp and back yields a different date time.

Europe/London

$ TZ=Europe/London linx
 _     _ __   _ _  __  ___
/ |   | |  \ | | |/ / / ._\
| |   | | , \| |   /  \  \
| |___| | |\ \ | |\ \ _\  \
|_____|_|_| \__|_| \_|____/
Welcome to Links version 0.9.7 (Burghmuirhead)
links> var t1 = parseDate("2022-05-20 15:00:00+0");
t1 = 2022-05-20 16:00:00.000000+1 : DateTime
links> var t2 = dateToInt(t1);
t2 = 1653055200 : Int
links> var t3 = intToDate(t2);
t3 = 2022-05-20 15:00:00.000000+1 : DateTime
links> var t4 = dateToInt(t3);
t4 = 1653051600 : Int

Australia/Sydney

$ TZ=Australia/Sydney linx
 _     _ __   _ _  __  ___
/ |   | |  \ | | |/ / / ._\
| |   | | , \| |   /  \  \
| |___| | |\ \ | |\ \ _\  \
|_____|_|_| \__|_| \_|____/
Welcome to Links version 0.9.7 (Burghmuirhead)
links> var t1 = parseDate("2022-05-20 15:00:00+0");
t1 = 2022-05-21 01:00:00.000000+10 : DateTime
links> var t2 = dateToInt(t1);
t2 = 1653022800 : Int
links> var t3 = intToDate(t2);
t3 = 2022-05-20 15:00:00.000000+10 : DateTime
links> var t4 = dateToInt(t3);
t4 = 1652986800 : Int

UTC (this is fine)

$ TZ=UTC linx
 _     _ __   _ _  __  ___
/ |   | |  \ | | |/ / / ._\
| |   | | , \| |   /  \  \
| |___| | |\ \ | |\ \ _\  \
|_____|_|_| \__|_| \_|____/
Welcome to Links version 0.9.7 (Burghmuirhead)
links> var t1 = parseDate("2022-05-20 15:00:00+0");
t1 = 2022-05-20 15:00:00.000000+0 : DateTime
links> var t2 = dateToInt(t1);
t2 = 1653058800 : Int
links> var t3 = intToDate(t2);
t3 = 2022-05-20 15:00:00.000000+0 : DateTime
links> var t4 = dateToInt(t3);
t4 = 1653058800 : Int

I will say I don't know if I'm using links correctly, or how relevant this might be to links, or how the interaction with DB works etc.

dhil commented 1 year ago

Thanks! This looks like an issue for @SimonJF -- I'll let you have a look first.

jamescheney commented 1 year ago

I believe @SimonJF is away for a bit. It's totally plausible to me that we might not be doing the right thing here, especially since this may have been tested in a time/place where GMT/UTC would have been the default. Probably we should also be providing a variant of intToDate that takes an explicit timezone.

SimonJF commented 1 year ago

Thanks, will take a look when I’m back! I think @jamescheney is likely right in that we are probably relying on an underlying UK time assumption for intToDate. Wonder what happens on the client, too.