Datetime 处理日期时间精度>;长生不老药

Datetime 处理日期时间精度>;长生不老药,datetime,elixir,precision,Datetime,Elixir,Precision,我的代码中有此函数: defp to_date({year, month, day}), do: NaiveDateTime.from_erl!({{year, month, day}, {0, 0, 0}}, {0, 6}) |> NaiveDateTime.to_string() defp to_date({{year, month, day}, {hour, min, sec, msec}}) when msec < 1000000, do: NaiveDate

我的代码中有此函数:

  defp to_date({year, month, day}), do: NaiveDateTime.from_erl!({{year, month, day}, {0, 0, 0}}, {0, 6}) |> NaiveDateTime.to_string()
  defp to_date({{year, month, day}, {hour, min, sec, msec}}) when msec < 1000000,
    do: NaiveDateTime.from_erl!({{year, month, day}, {hour, min, sec}}, {msec, 6}) |> NaiveDateTime.to_string()

  defp to_date(x), do: x
但使用下面的代码处理日期会引发此异常:

iex(46)> DB.get(DB.Users, "select * from users where user_id = 1")                      
** (ArgumentError) cannot convert {{2017, 11, 30}, {18, 37, 26}} to naive datetime, reason: :invalid_time
    (elixir) lib/calendar/naive_datetime.ex:549: NaiveDateTime.from_erl!/2
    (rmas) lib/db.ex:34: DB.to_date/1
    (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2
    (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2
    (rmas) lib/db.ex:26: anonymous fn/3 in DB._objects/3
    (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2
    (rmas) lib/db.ex:17: DB.get/3
源数据值为:
{2017,11,30},{18,37,26,2690120}
A
datetime2(7)
字段存储精度为十分之一微秒。A
NaiveDateTime
仅支持微秒的精度,因此您可以将该值除以10以获得微秒并使用该值:

defp to_date({{year, month, day}, {hour, min, sec, seven}}),
  do: NaiveDateTime.from_erl!({{year, month, day}, {hour, min, sec}}, {div(seven, 10), 6}) |> NaiveDateTime.to_string()

我们使用
div
而不是
进行除法,因此结果是一个整数而不是一个浮点。

您的异常显示一个包含3个元素的时间元组,而您的源数据值显示它是4个元素。正确的是什么?@JonasDellinger源值是4个元素,它是一个erlang时间格式Elixir的错误报告在某些情况下只显示3个元素reason@JonasDellinger我用完整的错误更新了这个问题,为什么微秒大于6位数?看起来您正在使用的库中有错误。对于>1e6微秒的时间,您希望做什么?添加额外的秒数字段?核心团队为什么没有设计NaiveDateTime.from_erl!要处理多个
{0..999999,0..6}
?考虑到虚拟机支持:纳秒?
defp to_date({{year, month, day}, {hour, min, sec, seven}}),
  do: NaiveDateTime.from_erl!({{year, month, day}, {hour, min, sec}}, {div(seven, 10), 6}) |> NaiveDateTime.to_string()