web-dev-qa-db-fra.com

Obtenir la date et l'heure actuelles dans Elixir

Cela semble être une question vraiment idiote, mais comment obtenir et afficher la date ou l'heure actuelle dans Elixir? J'ai essayé de passer par les docs mais je n'ai rien trouvé. Dois-je utiliser une fonction Erlang?

63
Graham Conzett

Pour répondre plus précisément à votre question (bien que j'apprécie vraiment la recommandation d'Onorio d'utiliser Timex!), Vous pouvez obtenir la date et l'heure actuelles à partir de la bibliothèque standard Erlang à l'aide de :calendar.universal_time() ou :calendar.local_time(). Il existe un certain nombre de fonctions utiles pour travailler avec le type datetime de Erlang dans le module calendar, mais elles sont quelque peu limitées et ne vous fournissent rien pour l’analyse ou la mise en forme des dates, qui est la destination de Timex.

46
bitwalker

Vous pouvez utiliser DateTime.utc_now/0 pour obtenir DateTime UTC.

42
Jimmar

À partir d'Erlang 19.1:

:os.system_time(:millisecond)

De Erlang 18:

:os.system_time(:milli_seconds)

Donne l'horodatage UNIX actuel UTC.

Merci @HenrikN pour avoir lié le blog http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html

24
TalkLittle

NaiveDateTime

Si vous ne vous souciez pas du fuseau horaire et que vous voulez juste une date et une heure pures, utilisez NaiveDateTime :

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

Date et heure

Si vous souhaitez également obtenir les détails du fuseau horaire, utilisez DateTime , qui renverra également des informations comme le nom du fuseau horaire, le décalage UTC, le décalage STD et l'abréviation du fuseau horaire:

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"}

Vous pouvez également appeler to_date/1 et to_time/1 à partir de ces modules pour obtenir les valeurs de date et d'heure spécifiques à partir des structures datetime.

12
Sheharyar

Je pense que votre meilleur pari est d'utiliser la bibliothèque timex de Paul Schoenfelder (alias BitWalker) pour Elixir. La lib est ici: https://github.com/bitwalker/timex et vous pouvez obtenir le package à partir de hex.pm https://hex.pm/packages/timex . Paul a gentiment expliqué comment utiliser la bibliothèque sur la page readme de ce dépôt github.

Vous pouvez faire des appels aux libs natives Erlang mais je pense que la librairie de Paul est supérieure quand on a affaire à Elixir.

11
Onorio Catenacci

Cela dépend du format dans lequel vous le souhaitez. 

Vous pouvez utiliser n’importe quelle fonction de la bibliothèque standard Erlang d’Elixir. Traditionnellement, vous obteniez l'heure avec la fonction now/0 :

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

Cela représente time_t 1 487 549 978,29683, soit 19 minutes, 38,29683 secondes après minuit UTC le lundi 20 février 2017.

Cependant, depuis Erlang/OTP 18, cette fonction est déconseillée. Une des raisons est que Erlang garantit que la valeur de retour augmentera chaque appel. Si vous l'appelez en boucle étroite sur une machine assez rapidement pour l'appeler plus d'une fois par microseconde, l'horodatage renvoyé devancera le temps réel. 

Le remplacement est une API avec plus de précision et de contrôle . L’interface principale avec cette nouvelle API est la fonction os:system_time/0 , qui renvoie l’heure de la période dans une unité définie par le système:

iex(2)> :os.system_time
1487550102372148000

Vous pouvez demander une unité spécifique avec system_time/1, cependant:

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

Depuis Elixir 1.2, ces fonctions sont également disponibles dans le module natif System :

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

Pour une interface plus conviviale mais toujours native pour Elixir, utilisez le module calendar , qui vous donnera des n-uplets:

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

Depuis la version 1.3, Elixir dispose également de sa propre suite de modules permettant de manipuler les dates et heures: Date et DateTime . Vous pouvez utiliser ses fonctions pour obtenir la date ou l'heure en cours de la manière suivante:

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

Vous pouvez également utiliser :os.timestamp\0, qui renvoie {megaseconds, seconds, microseconds} à partir de l'UTC. :os.timestamp |> :calendar.now_to_datetime vous donnera maintenant au format erlang standard {{YYYY, MM, DD}, {HH, MM, SS}}.

5
G Amini

Si vous avez besoin de gérer l'heure d'été ou les fuseaux horaires, j'ai créé une bibliothèque pour cela: Calendrier .

Pour obtenir l'heure actuelle, utilisez par exemple Calendar.DateTime.now("America/Los_Angeles") pour l'heure actuelle à Los Angeles ou Calendar.DateTime.now_utc pour l'heure actuelle en UTC.

4
Lau

Pour obtenir l'horodatage Unix

DateTime.to_unix(DateTime.utc_now)
1
radzserg

Pour obtenir le nombre de millisecondes (horodatage Unix):

DateTime.utc_now() |> DateTime.to_unix(:millisecond)
0
Sam Houston