azimlord
Form for utc_datetime
Hi guys,
I’m having some trouble with utc_datetime.
So I have a form that accept start_time and end_time which both in utc_datetime and inside a bookings table.
The problem is that I’m in Malaysia so the booking that is created will be in UTC and when I convert it to "Asia/Kuala_Lumpur" using timex, it will show a different time.
Timex.Timezone.convert(booking.end_time, "Asia/Kuala_Lumpur")
For example:
start_time: 2019-09-08 22:00:00
end_time: 2019-09-08 23:00:00
when convert it using timex to "Asia/Kuala_Lumpur"
start_time: 2019-09-09 06:00:00
end_time: 2019-09-09 07:00:00
Now I see that I have 2 options:
- Use
naive_datetimeinstead ofutc_datetimeand store the timezone in a separate column - Manipulate the
start_timeandend_timefrom the form and shift it to the UTC timezone which I already tried and failed.
changeset
|> put_change(:start_time, Timex.shift(Timex.to_datetime(start_time, "Asia/Kuala_Lumpur"), "Etc/UTC"))
|> put_change(:end_time, Timex.shift(Timex.to_datetime(end_time, "Asia/Kuala_Lumpur"), "Etc/UTC"))
I’m not sure if I did it correctly or not and I’m not sure which is the best way
Thanks for your help in advance!
Marked As Solved
LostKobrakai
The problem you’re facing is that the submitted value of a datetime_local_input does not include timezone information at all. It’ll send the server a (“naive”) iso8601 datetime without timezone information. It’s also unlikely to change. Your utc_datetime field will then assume it’s UTC, because that column is meant to only ever hold datetimes with UTC set as timezone.
I’ve spent some time to code up and document how I’d handle those cases and hide a bit of the boilerplate necessary. Since elixir 1.8 elixir can finally handle the problem on it’s own with a timezone database configured.
Also Liked
LostKobrakai
You have it mostly correct.
TzDatetime.handle_datetime(cs, input_datetime: :start_time, datetime: :start_time)
I’d suggest a virtual field for the input separate to the field storing the utc_datetime, but this should work. Also you don’t need to require TzDatetime. There are no macros involved here so just calling the functions is enough.
The timezone field you’ll need to set somehow either by letting the user submit the value or adding it to the changeset based on other information your system has.
As for the original_offset: You shouldn’t need to care about that at all. It’s set by handle_datetime/2 and read by original_datetime/2. The latter will return different values if there’s a missmatch detected between the stored offset and the offset based on your current timezone database.
azimlord
Nice. I works! Thank you!
Convert the start_time and end_time using Timex, shows the correct time
Thank you very much! ![]()
LostKobrakai
Please use original_datetime/2 to convert the utc_datetime back to your original timezone. It mostly does shift the timezone just like timex does, but you’ll be made aware if the timezone definitions changed to cause a different offset to the time when the datetime was stored. This will hardly ever happen for datetimes in the past, but is a valid problem to look for in future datetimes.








