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?
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.
Vous pouvez utiliser DateTime.utc_now/0
pour obtenir DateTime UTC.
À 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
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]
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.
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.
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>
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}}
.
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.
Pour obtenir l'horodatage Unix
DateTime.to_unix(DateTime.utc_now)
Pour obtenir le nombre de millisecondes (horodatage Unix):
DateTime.utc_now() |> DateTime.to_unix(:millisecond)