2017-02-08 4 views
0

Ich möchte eine Zeitdifferenz in Minuten zwischen "Utc now" und einer Variablen vom Typ Ecto.DateTime finden. Was ist der einfachste Weg das zu tun? Soll ich beide in Unix-Zeit umrechnen und subtrahieren anstatt Mustervergleiche durchzuführen und zuerst Jahr, Monat, Tag und Stunde zu vergleichen und erst danach tatsächlich die Minuten zu subtrahieren? Ich möchte keine Drittanbieter-Abhängigkeiten verwenden.Wie Minuten in 2 Daten in Phoenix/Ecto zu vergleichen?

+0

Sie 'jetzt meinen Sie()' von SQL? –

+0

Mit "utc now" meinen Sie das neue 'DateTime.utc_now/0'? – Dogbert

Antwort

1

JIC: Ecto.DateTime is a struct und es hat einen Ecto.DateTime.from_erl/1 Helfer Er ist auch verantwortlich für „utc jetzt“ mit Ecto.DateTime.utc/1 Erzeugung (sowie from_unix! und einige andere.).

Elixir DateTime hat wiederum to_unix/2, daher könnte man:

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) Keine Funktionsklausel, die in DateTime.to_unix/2 übereinstimmt – Torito

+0

Oh, in der Tat, 'DateTime.to_unix/2' erwartet die' DateTime', nicht 'Ecto.DateTime'. Wird in einer Sekunde aktualisiert. – mudasobwa

1

Sie Ecto.DateTime-DateTime mit UTC Zeitzone konvertieren und dann vergleichen ihre 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 

Pattern Matching kein wäre Eine gute Idee, da Sie jeden Fall des Jahres/des Monats/des Tages/der Stunde/Minute/Sekunde, die nach dem Addieren/Subtrahieren überläuft, behandeln müssen.

0

Elixir hat jetzt eine DateTime.diff/3 Methode.

DateTime.diff(dt1, dt2, :minute) 

(In Ihrem Fall DTX ist DateTime.utc_now)

Verwandte Themen