【问题标题】:Converting "4:00AM" to ISO8601将“4:00AM”转换为 ISO8601
【发布时间】: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


    【解决方案1】:

    Postgres 在日期和时间格式方面非常灵活。你可以cast这些字符串:

    select '4:00AM'::time, '7:15PM'::time
    
    时间 |时间 :------- | :-------- 04:00:00 | 19:15:00

    【讨论】:

    • 基本上你需要在查询中转换参数。假设你有一个参数$1,那么$1::time。
    【解决方案2】:

    在 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。
    • 嗯,这将在原始问题中提供有用的信息。看起来你需要看看这个parsing
    【解决方案3】:

    可以手动将值转换为适当的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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-20
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多