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


83

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

답변:


56

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


1
훌륭한 답변입니다. 둘 다 감사합니다. Timex를 꼭 확인하겠습니다!
Graham Conzett



17

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 구조체에서 특정 날짜 및 시간 값을 가져올 수도 있습니다 .


12

가장 좋은 방법은 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가 더 우수하다고 생각합니다.


5
추천 Onorio 주셔서 감사합니다! 이 글을 읽는 모든 분들에게, 저는 우리가 Timex를 Elixir에서 날짜 / 시간에 대한 라이브러리로 이동시킬 수 있도록 기여에 매우 개방적이며, 아마도 언젠가는 그것이 동등하다면 Elixir 표준 라이브러리로 병합 할 수 있습니다. 도움이 필요하면 메시지를 보내거나 GitHub의 이슈 트래커에 들어가 풀 리퀘스트를 보내주세요!
bitwalker

1
@bitwalker 예, Erlang / Elixir는 날짜 / 시간 라이브러리를 위해 할 일이 많습니다. 그리고 timex도 Elixir에 통합 될 수 있기를 바랍니다. :)
Tony Han

11

원하는 형식에 따라 다릅니다.

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>

8

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

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

1
Nice one Sam, 그냥 내가 찾던 것;)
Dennis


6

일광 절약 시간 또는 시간대를 처리해야하는 경우이를위한 라이브러리를 만들었습니다. Calendar .

현재 시간을 얻으려면 예를 들어 Calendar.DateTime.now("America/Los_Angeles")로스 앤젤레스 Calendar.DateTime.now_utc의 현재 시간 또는 UTC의 현재 시간을 사용합니다.


2

유닉스 타임 스탬프를 얻으려면

DateTime.to_unix(DateTime.utc_now)

0

글쎄, 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.