/ / Come confrontare i minuti in 2 date a Phoenix / Ecto? - elisir, phoenix-framework, ecto

Come confrontare i minuti in 2 date a Phoenix / Ecto? - elisir, phoenix-framework, ecto

Voglio trovare una differenza di tempo in minuti tra "utc now" e una variabile di tipo Ecto.DateTime. Qual è il modo più semplice per farlo? Devo convertirli entrambi in unix time e sottrarre invece di fare la corrispondenza del pattern e confrontando prima anno, mese, giorno e ora e solo dopo i minuti effettivamente sottratti? Non sto cercando di utilizzare dipendenze di terze parti.

risposte:

1 per risposta № 1

JIC: Ecto.DateTime è una struttura e ha un Ecto.DateTime.from_erl/1 aiutante (come pure from_unix! e alcuni altri.) È anche responsabile della generazione di "utc now" con Ecto.DateTime.utc/1.

Elisir DateTime ha a sua volta to_unix/2, quindi si potrebbe:

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

1 per risposta № 2

Puoi convertire Ecto.DateTime a DateTime con il fuso orario UTC e quindi confrontare i loro 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

La corrispondenza del modello non sarebbe una buona idea, poiché dovrai gestire ogni caso dell'anno / mese / giorno / ora / minuto / secondo traboccante dopo l'aggiunta / sottrazione.


0 per risposta № 3

L'elisir ha un DateTime.diff/3 metodo ora.

DateTime.diff(dt1, dt2, :minute)

(Nel tuo caso è dtx DateTime.utc_now)