Установить дату и время в миллисекундах с точностью - эликсир
Я пытаюсь получить дату, которая имеет только 3 цифры в подсекундной части.
Используя timex, я получаю следующий результат:
iex(12)> {:ok, date} = Timex.format(Timex.shift(Timex.local, days: 16), "{ISO:Extended}")
{:ok, "2017-04-22T09:00:44.403879+03:00"}
Как я могу получить что-то вроде этого:
{: ok, "2017-04-22T09: 00: 44.403+03: 00"}?
2 ответа
Решение
DateTime
имеет microsecond
поле, которое является кортежем, содержащим значение и точность. Если вы измените точность на 3
Вы получите 3 цифры в микросекундном выходе. Я не смог найти ни одной функции в Timex, которая делает это, но вы можете изменить значение вручную:
iex(1)> dt = %{microsecond: {us, precision}} = Timex.now
#<DateTime(2017-04-06T08:26:24.041004Z Etc/UTC)>
iex(2)> precision
6
iex(3)> dt2 = %{dt | microsecond: {us, 3}}
#<DateTime(2017-04-06T08:26:24.041Z Etc/UTC)>
iex(4)> dt2 |> Timex.format!("{ISO:Extended}")
"2017-04-06T08:26:24.041+00:00"
Начиная с Elixir 1.6.0 теперь есть функция truncate/2, присутствующая в модулях Time, DateTime и NativeDateTime для этого:
iex(1)> dt = Timex.now()
#DateTime<2018-02-16 19:03:51.430946Z>
iex(2)> dt2 = DateTime.truncate(dt, :millisecond)
#DateTime<2018-02-16 19:03:51.430Z>