【发布时间】:2020-11-09 12:10:46
【问题描述】:
前端正在发送时间值,例如“4:00AM”或“7:15PM”,我需要将它们转换为 ISO8601(即分别为“04:00:00”和“19:15:00”),以便我可以将它们存储在 PostgreSQL 的“没有时区的时间”列中。
最简单的方法是什么?我有 Timex,并且正在使用 Ecto。
【问题讨论】:
标签: sql string postgresql elixir ecto
前端正在发送时间值,例如“4:00AM”或“7:15PM”,我需要将它们转换为 ISO8601(即分别为“04:00:00”和“19:15:00”),以便我可以将它们存储在 PostgreSQL 的“没有时区的时间”列中。
最简单的方法是什么?我有 Timex,并且正在使用 Ecto。
【问题讨论】:
标签: sql string postgresql elixir ecto
Postgres 在日期和时间格式方面非常灵活。你可以cast这些字符串:
select '4:00AM'::time, '7:15PM'::time
时间 |时间
:------- | :--------
04:00:00 | 19:15:00
【讨论】:
$1,那么$1::time。
在 Postgres 中,'timestamp(tz)、date、time(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 完成工作。
【讨论】:
due_time: "4:00AM" 时,Ecto 返回Due time is invalid。
可以手动将值转换为适当的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, m, 0})
#⇒ ~T[16:00:00]
【讨论】: