이것은 정말 멍청한 질문처럼 보이지만 Elixir에서 현재 날짜 또는 시간을 어떻게 얻고 표시합니까? 문서 를 살펴 보았지만 아무것도 찾을 수 없었습니다. Erlang 기능을 사용해야합니까?
답변:
질문에 더 구체적으로 대답하려면 (Timex를 사용하라는 Onorio의 권장 사항에 정말 감사드립니다!) :calendar.universal_time()
또는을 사용하여 Erlang 표준 라이브러리에서 현재 날짜와 시간을 가져올 수 있습니다 :calendar.local_time()
. 모듈 datetime
에서 Erlang의 유형으로 작업하는 데 유용한 많은 기능이 calendar
있지만 다소 제한적이며 Timex가 제공되는 날짜를 구문 분석하거나 형식화 하는 데 필요한 기능을 제공하지 않습니다.
DateTime.utc_now/0
UTC DateTime을 가져 오는 데 사용할 수 있습니다 .
Erlang 19.1에서 :
:os.system_time(:millisecond)
Erlang 18에서 :
:os.system_time(:milli_seconds)
현재 UNIX 타임 스탬프 UTC를 제공합니다.
블로그 게시물 http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html 을 연결해 주신 @HenrikN에게 감사드립니다 .
시간대에 신경 쓰지 않고 순수한 날짜와 시간을 원한다면 NaiveDateTime
다음을 사용하십시오 .
NaiveDateTime.utc_now
# => ~N[2017-11-30 20:49:54.660724]
시간대 세부 정보도 원하는 경우을 사용 DateTime
하면 시간대 이름, UTC 오프셋, STD 오프셋 및 시간대 약어와 같은 항목도 반환됩니다.
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"}
그런 다음 to_date/1
및 to_time/1
이러한 모듈에서 호출 하여 datetime 구조체에서 특정 날짜 및 시간 값을 가져올 수도 있습니다 .
가장 좋은 방법은 Elixir에 Paul Schoenfelder (일명 BitWalker)의 timex 라이브러리를 사용하는 것입니다. lib는 https://github.com/bitwalker/timex에 있으며 hex.pm https://hex.pm/packages/timex 에서 패키지를 가져올 수 있습니다 . Paul은 해당 github repo의 readme 페이지에서 라이브러리 사용 방법에 대한 좋은 설명을 친절하게 제공했습니다.
네이티브 Erlang 라이브러리를 호출 할 수는 있지만 Elixir를 다룰 때 Paul의 lib가 더 우수하다고 생각합니다.
원하는 형식에 따라 다릅니다.
Elixir의 Erlang 표준 라이브러리에있는 모든 기능을 사용할 수 있습니다. 전통적으로 다음과 같은 now/0
기능으로 시간을 얻을 수 있습니다.
iex(1)> :erlang.now
{1487, 549978, 29683}
이는 time_t
2017 년 2 월 20 일 월요일 자정 UTC 이후 19 분 38.29683 초인 1,487,549,978.29683을 나타냅니다 .
그러나 Erlang / OTP 18 이후로이 기능은 더 이상 사용되지 않습니다. 그 이유 중 하나는 Erlang이 반환 값이 모든 호출을 증가시킬 것이라고 보장하기 때문입니다. 마이크로 초당 한 번 이상 호출 할 수있을만큼 빠른 속도로 머신에서 타이트한 루프에서 호출하면 반환 된 타임 스탬프가 실시간보다 빨라집니다.
대체는 더 정밀하고 제어 가능한 API입니다 . 이 새로운 API에 대한 기본 인터페이스 os:system_time/0
는 시스템 정의 단위로 에포크 시간을 반환 하는 함수입니다.
iex(2)> :os.system_time
1487549978296838000
system_time/1
하지만을 사용 하여 특정 단위를 요청할 수 있습니다 .
iex(3)> :os.system_time(:millisecond)
1487549978296
Elixir 1.2부터 이러한 함수는 native System
모듈 에서도 사용할 수 있습니다 .
iex(4)> System.system_time(:second)
1487549978
더 친숙하지만 여전히 Elixir 네이티브 인터페이스를 원하면 calendar
모듈을 사용 하면 튜플이 제공됩니다.
iex(5)> :calendar.universal_time
{{2017, 2, 20}, {0, 19, 38}}
1.3 이후, 비약은 날짜와 시간을 조작하기위한 모듈 자체의 제품군을했다 : Date
와 DateTime
. 함수를 사용하여 다음과 같이 현재 날짜 또는 시간을 가져올 수 있습니다.
iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:19:38.29683Z>
UTC에서 :os.timestamp\0
반환 {megaseconds, seconds, microseconds}
되는를 사용할 수도 있습니다 . :os.timestamp |> :calendar.now_to_datetime
이제 erlang 표준 {{YYYY, MM, DD}, {HH, MM, SS}}
형식으로 제공 됩니다.
글쎄, Timex는 일반적으로 구출하지만 아래의 몇 가지 트릭이 도움이 될 수 있습니다.
{erl_date, erl_time} = :calendar.local_time()
# {{2020, 11, 19}, {0, 6, 36}}
{:ok, time} = Time.from_erl(erl_time)
# {:ok, ~T[00:06:36]}
{:ok, date} = Date.from_erl(erl_date)
# {:ok, ~D[2020-11-19]}
Calendar.strftime(time, "%c", preferred_datetime: "%H:%M:%S")
# "00:06:36"
Calendar.strftime(date, "%c", preferred_datetime: "%m-%d-%Y")
# "11-19-2020"