Obtenir la date et l’heure actuelles dans Elixir

Cela semble être une question vraiment stupide mais comment peut-on obtenir et afficher la date ou l’heure actuelle dans Elixir? J’ai essayé de parcourir les documents mais je n’ai rien trouvé. Dois-je utiliser une fonction Erlang?

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 en utilisant :calendar.universal_time() ou :calendar.local_time() . Il y a un certain nombre de fonctions utiles pour travailler avec le type datetime d’Erlang dans le module de calendar , mais elles sont quelque peu limitées et ne vous fournissent rien pour parsingr ou formater les dates, c’est là qu’intervient Timex.

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

De Erlang 19.1:

 :os.system_time(:millisecond) 

De Erlang 18:

 :os.system_time(:milli_seconds) 

Indique l’horodatage UNIX actuel UTC.

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

Je pense que votre meilleur pari est d’utiliser la bibliothèque Timex de Paul Schoenfelder (aka BitWalker) pour Elixir. La lib est ici: https://github.com/bitwalker/timex et vous pouvez obtenir le paquet depuis hex.pm https://hex.pm/packages/timex . Paul a gentiment expliqué comment utiliser la bibliothèque sur la page readme de ce repository github.

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

NaiveDateTime

Si vous ne vous souciez pas du fuseau horaire et que vous voulez simplement de la date et de l’heure, utilisez NaiveDateTime :

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

DateTime

Si vous voulez également des détails sur le fuseau horaire, utilisez DateTime , qui renverra également des éléments tels que 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 ensuite également appeler to_date/1 et to_time/1 depuis ces modules pour obtenir les valeurs de date et d’heure spécifiques des structures datetime.

Cela dépend de quel format vous le voulez.

Vous pouvez utiliser n’importe quelle fonction de la bibliothèque standard d’Erlang à partir d’Elixir. Traditionnellement, vous auriez le temps avec la fonction now/0 :

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

Cela représente le temps_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 obsolète; L’une des raisons est qu’Erlang garantit que la valeur de retour augmentera chaque appel. Si vous l’appelez dans une boucle serrée sur une machine suffisamment rapide pour pouvoir 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 de cette nouvelle API est la fonction os:system_time/0 , qui renvoie l’heure de os:system_time/0 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 , bien que:

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

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

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

Pour une interface plus conviviale mais toujours native d’Elixir, utilisez le module de calendar , qui vous donnera des tuples:

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

Depuis 1.3, Elixir a également sa propre suite de modules pour manipuler les dates et les heures: Date et DateTime . Vous pouvez utiliser ses fonctions pour obtenir la date ou l’heure actuelle comme suit:

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

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

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

Pour obtenir l’heure actuelle, vous utiliserez 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.

Pour obtenir l’horodatage unix

 DateTime.to_unix(DateTime.utc_now)