将“ 4:00 AM”转换为ISO8601

问题描述

前端正在发送时间值,例如“ 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]