azimlord

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:

  1. Use naive_datetime instead of utc_datetime and store the timezone in a separate column
  2. Manipulate the start_time and end_time from 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

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

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

azimlord

Nice. I works! Thank you!

Convert the start_time and end_time using Timex, shows the correct time

Thank you very much! :grinning:

LostKobrakai

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.

Last Post!

LostKobrakai

LostKobrakai

This depends a bit on your architecture, but generally I’d suggest doing that close to where you pull items with those datetimes out of the db.

Where Next?

Popular in Questions Top

jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
Lily
In templates/appointment/index.html.eex: <%= for appointment <- @appointments do %> <tr> <td><%= appoi...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

Other popular topics Top

jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40082 209
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New

We're in Beta

About us Mission Statement