[elixir] Elixir에서 현재 날짜 및 / 또는 시간 가져 오기

이것은 정말 멍청한 질문처럼 보이지만 Elixir에서 현재 날짜 또는 시간을 어떻게 얻고 표시합니까? 문서 를 살펴 보았지만 아무것도 찾을 수 없었습니다. Erlang 기능을 사용해야합니까?



답변

질문에 더 구체적으로 대답하려면 (Timex를 사용하라는 Onorio의 권장 사항에 정말 감사드립니다!) :calendar.universal_time()또는을 사용하여 Erlang 표준 라이브러리에서 현재 날짜와 시간을 가져올 수 있습니다 :calendar.local_time(). 모듈 datetime에서 Erlang의 유형으로 작업하는 데 유용한 많은 기능이 calendar있지만 다소 제한적이며 Timex가 제공되는 날짜를 구문 분석하거나 형식화 하는 데 필요한 기능을 제공하지 않습니다.


답변

DateTime.utc_now/0UTC 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다음을 사용하십시오 .

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/1to_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_t2017 년 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 이후, 비약은 날짜와 시간을 조작하기위한 모듈 자체의 제품군을했다 : DateDateTime. 함수를 사용하여 다음과 같이 현재 날짜 또는 시간을 가져올 수 있습니다.

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


답변

밀리 초 (Unix Timestamp) 수를 얻으려면 :

DateTime.utc_now() |> DateTime.to_unix(:millisecond)