2017-02-08 2 views
0

Я хочу найти разницу во времени в минутах между «utc now» и переменной типа Ecto.DateTime. Какой самый простой способ сделать это? Должен ли я конвертировать оба из них в unix-время и вычитать вместо того, чтобы выполнять сопоставление образцов и сравнивать год, месяц, день и час сначала и только после этого фактически вычитать минуты? Я не ищу никаких зависимостей сторонних разработчиков.Как сравнить минуты в 2 числах в Phoenix/Ecto?

+0

ли вы имеете в виду 'сейчас()' из SQL? –

+0

Под «utc now» вы подразумеваете новый 'DateTime.utc_now/0'? – Dogbert

ответ

1

JIC: Ecto.DateTime is a struct и имеет Ecto.DateTime.from_erl/1 помощника Он также отвечает за создание «в настоящее время UTC» с Ecto.DateTime.utc/1 (а также from_unix! и некоторыми другими.).

Elixir DateTime в свою очередь to_unix/2, следовательно, один может:

dt1, dt2 = [ecto_time, Ecto.DateTime.utc] 
      |> Enum.map(&Ecto.DateTime.to_erl/1) 
      |> Enum.map(&NaiveDateTime.from_erl!/1) 
      |> Enum.map(&DateTime.from_naive!(&1, "Etc/UTC")) 
      |> Enum.map(&DateTime.to_unix(&1)) 
mins = (dt1 - dt2)/60 
+0

(FunctionClauseError) не согласуется с предложением функции в DateTime.to_unix/2 – Torito

+0

Да, 'DateTime.to_unix/2' ожидает' DateTime', а не 'Ecto.DateTime'. Будет обновляться через секунду. – mudasobwa

1

Вы можете конвертировать Ecto.DateTime в DateTime с UTC Timezone, а затем сравнить их to_unix:

iex(1)> now = DateTime.utc_now |> DateTime.to_unix 
1486544161 
iex(2)> now2 = Ecto.DateTime.utc |> Ecto.DateTime.to_erl |> NaiveDateTime.from_erl! |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_unix 
1486544206 
iex(3)> (now2 - now)/60 
0.75 

сопоставления с образцом не будет хорошая идея, так как вам придется обрабатывать каждый случай года/месяца/дня/часа/минуты/секунды переполнения после добавления/вычитания.

0

Elixir теперь имеет метод DateTime.diff/3.

DateTime.diff(dt1, dt2, :minute) 

(В вашем случае DTX является DateTime.utc_now)

Смежные вопросы