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 № 1JIC: 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
)