Nhận ngày và giờ hiện tại trong Elixir


83

Đây có vẻ là một câu hỏi thực sự ngớ ngẩn nhưng làm cách nào để lấy và hiển thị ngày hoặc giờ hiện tại trong Elixir? Tôi đã thử xem qua các tài liệu nhưng không tìm thấy gì. Tôi có cần sử dụng hàm Erlang không?

Câu trả lời:


56

Để trả lời câu hỏi của bạn cụ thể hơn (mặc dù tôi thực sự đánh giá cao khuyến nghị của Onorio sử dụng Timex!), Bạn có thể lấy ngày và giờ hiện tại từ lib tiêu chuẩn Erlang bằng cách sử dụng :calendar.universal_time()hoặc :calendar.local_time(). Có một số chức năng hữu ích để làm việc với loại Erlang datetimetrong calendarmô-đun, nhưng chúng hơi hạn chế và không cung cấp cho bạn bất kỳ thứ gì để phân tích cú pháp hoặc định dạng ngày, đó là lúc Timex xuất hiện.


1
Câu trả lời tuyệt vời, cảm ơn cả hai và tôi chắc chắn sẽ xem Timex!
Graham Conzett



17

NaiveDateTime

Nếu bạn không quan tâm đến múi giờ và chỉ muốn Ngày và Giờ thuần túy, hãy sử dụng NaiveDateTime:

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

Ngày giờ

Nếu bạn cũng muốn biết chi tiết về múi giờ, hãy sử dụng DateTime, cũng sẽ trả về những thứ như tên múi giờ, độ lệch UTC, độ lệch STD và chữ viết tắt của múi giờ:

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"}

Sau đó, bạn cũng có thể gọi to_date/1to_time/1từ các mô-đun này để nhận các giá trị ngày và giờ cụ thể từ cấu trúc datetime.


12

Tôi nghĩ cách tốt nhất của bạn là sử dụng thư viện timex của Paul Schoenfelder (hay còn gọi là BitWalker) cho Elixir. Lib ở đây: https://github.com/bitwalker/timex và bạn có thể tải gói từ hex.pm https://hex.pm/packages/timex . Paul vui lòng cung cấp một giải thích tốt về cách sử dụng thư viện trên trang readme của repo github đó.

Bạn có thể thực hiện các cuộc gọi đến các lib Erlang bản địa nhưng tôi nghĩ lib của Paul vượt trội hơn khi một người đang xử lý Elixir.


5
Cảm ơn vì lời giới thiệu Onorio! Đối với bất kỳ ai đang đọc điều này, tôi rất sẵn lòng đóng góp để chúng tôi có thể biến Timex trở thành thư viện truy cập ngày / giờ trong Elixir và có lẽ một ngày nào đó sẽ hợp nhất nó vào thư viện tiêu chuẩn Elixir nếu nó phải đạt chuẩn. Nếu bạn muốn trợ giúp, hãy gửi cho tôi một tin nhắn hoặc đi sâu vào trình theo dõi vấn đề trên GitHub và gửi một số yêu cầu kéo!
bitwalker

1
@bitwalker Vâng, Erlang / Elixir có nhiều thứ phải làm cho lib ngày / giờ. Và tôi hy vọng timex cũng có thể được hợp nhất thành Elixir :)
Tony Han

11

Nó phụ thuộc vào định dạng bạn muốn.

Bạn có thể sử dụng bất kỳ chức năng nào trong thư viện chuẩn Erlang từ Elixir. Theo truyền thống, bạn sẽ nhận được thời gian với now/0hàm:

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

Điều đó đại diện cho time_t1.487.549.978,29683, là 19 phút, 38,29683 giây sau nửa đêm giờ UTC vào Thứ Hai, ngày 20 tháng 2 năm 2017.

Tuy nhiên, kể từ Erlang / OTP 18, chức năng đó không được dùng nữa; một trong những lý do là Erlang đảm bảo rằng giá trị trả về sẽ tăng mỗi lần gọi. Nếu gọi nó trong một vòng lặp chặt chẽ trên một máy đủ nhanh để gọi nó nhiều hơn một lần mỗi micro giây, thì dấu thời gian trả về sẽ đi trước thời gian thực.

Thay thế là một API với độ chính xác và kiểm soát cao hơn . Giao diện chính của API mới này là os:system_time/0hàm, trả về thời gian kỷ nguyên trong một đơn vị do hệ thống xác định:

iex(2)> :os.system_time
1487549978296838000

Tuy nhiên, bạn có thể yêu cầu một đơn vị cụ thể với system_time/1:

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

Kể từ Elixir 1.2, những chức năng đó cũng đã có sẵn trong Systemmô-đun gốc :

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

Để có giao diện gốc Elixir thân thiện hơn nhưng vẫn là bản địa, hãy sử dụng calendarmô-đun, mô-đun này sẽ cung cấp cho bạn các bộ giá trị:

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

Kể từ 1.3, Elixir cũng đã có bộ mô-đun riêng để thao tác ngày và giờ: DateDateTime. Bạn có thể sử dụng các chức năng của nó để lấy ngày hoặc giờ hiện tại như sau:

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

8

Để nhận số mili giây (Unix Timestamp):

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

1
Người đẹp tuyệt vời Sam, đúng như những gì tôi đang tìm kiếm;)
Dennis


6

Nếu bạn cần đối phó với Giờ tiết kiệm ánh sáng ban ngày hoặc múi giờ, tôi đã tạo một thư viện cho điều đó: Lịch .

Để có được thời gian hiện tại, bạn sẽ sử dụng chẳng hạn như Calendar.DateTime.now("America/Los_Angeles")thời gian hiện tại ở Los Angeles hoặc Calendar.DateTime.now_utcthời gian hiện tại ở UTC.


2

Để lấy dấu thời gian unix

DateTime.to_unix(DateTime.utc_now)

0

Chà, Timex thường đến để giải cứu, tuy nhiên một số thủ thuật dưới đây có thể hữu ích:

{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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.