Abrufen des aktuellen Datums und / oder der aktuellen Uhrzeit in Elixir

80

Dies scheint eine wirklich dumme Frage zu sein, aber wie erhält man das aktuelle Datum oder die aktuelle Uhrzeit in Elixir und zeigt sie an? Ich habe versucht, die Dokumente durchzugehen , konnte aber nichts finden. Muss ich eine Erlang-Funktion verwenden?

Graham Conzett
quelle

Antworten:

54

Um Ihre Frage genauer zu beantworten (obwohl ich Onorios Empfehlung zur Verwendung von Timex sehr schätze!), Können Sie das aktuelle Datum und die aktuelle Uhrzeit mit :calendar.universal_time()oder aus der Erlang-Standardbibliothek abrufen :calendar.local_time(). Es gibt eine Reihe nützlicher Funktionen für die Arbeit mit Erlangs datetimeTyp im calendarModul, die jedoch etwas eingeschränkt sind und Ihnen nichts zum Parsen oder Formatieren von Daten bieten. Hier kommt Timex ins Spiel.

Bitwalker
quelle
1
Tolle Antwort, danke euch beiden und ich werde Timex auf jeden Fall ausprobieren!
Graham Conzett
62

Sie können verwenden DateTime.utc_now/0, um UTC DateTime abzurufen.

Jimmar
quelle
16

NaiveDateTime

Wenn Sie sich nicht für die Zeitzone interessieren und nur reines Datum und Uhrzeit wünschen, verwenden Sie NaiveDateTime:

NaiveDateTime.utc_now
# => ~N[2017-11-30 20:49:54.660724]

Terminzeit

Wenn Sie auch Zeitzonendetails wünschen, verwenden Sie DateTime, wodurch auch Dinge wie Zeitzonenname, UTC-Versatz, STD-Versatz und Zeitzonenabkürzung zurückgegeben werden:

DateTime.utc_now
# => %DateTime{calendar: Calendar.ISO, day: 30, hour: 20, microsecond: {667345, 6}, minute: 51, month: 11, second: 58, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2017, zone_abbr: "UTC"}

Sie können dann auch to_date/1und to_time/1von diesen Modulen aus anrufen , um die spezifischen Datums- und Zeitwerte aus den Datums- / Uhrzeitstrukturen abzurufen.

Sheharyar
quelle
12

Ich denke, Ihre beste Wahl ist es, die Timex-Bibliothek von Paul Schoenfelder (auch bekannt als BitWalker) für Elixir zu verwenden. Die Bibliothek ist hier: https://github.com/bitwalker/timex und Sie können das Paket von hex.pm https://hex.pm/packages/timex erhalten . Paul hat freundlicherweise auf der Readme-Seite dieses Github-Repos eine gute Erklärung zur Verwendung der Bibliothek gegeben.

Sie könnten die einheimischen Erlang-Bibliotheken anrufen, aber ich denke, Pauls Bibliothek ist überlegen, wenn es um Elixier geht.

Onorio Catenacci
quelle
5
Danke für die Empfehlung Onorio! Für jeden, der dies liest, bin ich sehr offen für Beiträge, damit wir Timex für Datums- / Uhrzeitangaben in Elixir zur Bibliothek machen und es vielleicht eines Tages in die Elixir-Standardbibliothek einbinden können, wenn es auf dem neuesten Stand sein sollte. Wenn Sie daran interessiert sind zu helfen, schreiben Sie mir eine Nachricht oder tauchen Sie in den Issue Tracker auf GitHub ein und senden Sie einige Pull-Anfragen!
Bitwalker
1
@bitwalker Ja, Erlang / Elixir hat viele Dinge zu tun für die Datums- / Zeitbibliothek. Und ich hoffe, Timex kann auch in Elixir integriert werden :)
Tony Han
11

Es hängt davon ab, in welchem ​​Format Sie es möchten.

Sie können jede Funktion in der Erlang-Standardbibliothek von Elixir verwenden. Traditionell würden Sie die Zeit mit der now/0Funktion bekommen:

iex(1)> :erlang.now
{1487, 549978, 29683}

time_tDies entspricht 1.487.549.978,29683, was 19 Minuten und 38,29683 Sekunden nach Mitternacht UTC am Montag, dem 20. Februar 2017, entspricht.

Seit Erlang / OTP 18 ist diese Funktion jedoch veraltet. Einer der Gründe ist, dass Erlang garantiert, dass der Rückgabewert bei jedem Anruf erhöht wird. Wenn Sie es in einer engen Schleife auf einem Computer schnell genug aufrufen, um es mehr als einmal pro Mikrosekunde aufzurufen, wird der zurückgegebene Zeitstempel der Echtzeit voraus.

Der Ersatz ist eine API mit mehr Präzision und Kontrolle . Die primäre Schnittstelle zu dieser neuen API ist die os:system_time/0Funktion, die die Epochenzeit in einer systemdefinierten Einheit zurückgibt:

iex(2)> :os.system_time
1487549978296838000

Sie können jedoch eine bestimmte Einheit anfordern mit system_time/1:

iex(3)> :os.system_time(:millisecond)
1487549978296

Seit Elixir 1.2 sind diese Funktionen auch im nativen SystemModul verfügbar :

iex(4)> System.system_time(:second)
1487549978

Verwenden calendarSie für eine benutzerfreundlichere, aber dennoch Elixir-native Benutzeroberfläche das Modul, mit dem Sie Tupel erhalten:

iex(5)> :calendar.universal_time
{{2017, 2, 20}, {0, 19, 38}}

Seit 1.3 verfügt Elixir auch über eine eigene Reihe von Modulen zur Bearbeitung von Datum und Uhrzeit: Dateund DateTime. Sie können seine Funktionen verwenden, um das aktuelle Datum oder die aktuelle Uhrzeit wie folgt abzurufen:

iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:19:38.29683Z>
Mark Reed
quelle
8

So ermitteln Sie die Anzahl der Millisekunden (Unix-Zeitstempel):

DateTime.utc_now() |> DateTime.to_unix(:millisecond)
Sam Houston
quelle
1
Netter Sam, genau das, wonach ich gesucht habe;)
Dennis
6

Sie können auch verwenden :os.timestamp\0, was {megaseconds, seconds, microseconds}von UTC zurückkehrt. :os.timestamp |> :calendar.now_to_datetimegeben Sie jetzt im erlang Standardformat {{YYYY, MM, DD}, {HH, MM, SS}}.

G Amini
quelle
3
Und um das in einen POSIX / UNIX-Zeitstempel zu bringen: michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html
Henrik N
6

Wenn Sie sich mit Sommerzeit oder Zeitzonen befassen müssen, habe ich eine Bibliothek dafür erstellt: Kalender .

Um die aktuelle Uhrzeit abzurufen, würden Sie beispielsweise Calendar.DateTime.now("America/Los_Angeles")die aktuelle Uhrzeit in Los Angeles oder Calendar.DateTime.now_utcdie aktuelle Uhrzeit in UTC verwenden.

Lau
quelle
2

Um einen Unix-Zeitstempel zu erhalten

DateTime.to_unix(DateTime.utc_now)
radzserg
quelle