问题描述
前端正在发送时间值,例如“ 4:00 AM”或“ 7:15 PM”,我需要将其转换为ISO8601(即分别为“ 04:00:00”和“ 19:15:00”),以便我可以将它们存储在Postgresql的“无时区的时间”列中。
最简单的方法是什么?我有可用的Timex,并且正在使用Ecto。
解决方法
Postgres对日期和时间格式很灵活。您可以cast
这些字符串:
select '4:00AM'::time,'7:15PM'::time
time | time :------- | :------- 04:00:00 | 19:15:00,
在Postgres中,“时间戳(tz),日期,时间(tz)等”未以格式存储。格式化是您在检索时要做的事情。所以:
create table time_test(time_fld time);
insert into time_test values ('4:00AM');
insert into time_test values ('7:15PM');
select time_fld from time_test ;
time_fld
----------
04:00:00
19:15:00
只需传递字符串,然后让Postgres完成工作即可。
,可以手动将值转换为适当的Time
结构。
iex|1 ▶ [h,m,pm?] =
...|1 ▶ "4:00PM"
...|1 ▶ |> String.downcase()
...|1 ▶ |> String.split(~r/:|(?<=\d)(?=\D)/)
#⇒ ["4","00","pm"]
iex|2 ▶ m = String.to_integer(m)
iex|3 ▶ h =
...|3 ▶ if(match?("pm",pm?),do: 12,else: 0) + String.to_integer(h)
#⇒ 16
iex|4 ▶ Time.from_erl!({h,0})
#⇒ ~T[16:00:00]