Đâ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?
Đâ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:
Để 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 datetime
trong calendar
mô-đ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.
Bạn có thể sử dụng DateTime.utc_now/0
để lấy DateTime UTC.
Từ Erlang 19.1:
:os.system_time(:millisecond)
Từ Erlang 18:
:os.system_time(:milli_seconds)
Cung cấp UTC dấu thời gian UNIX hiện tại.
Cảm ơn @HenrikN đã liên kết bài đăng trên blog http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html
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]
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/1
và to_time/1
từ các mô-đun này để nhận các giá trị ngày và giờ cụ thể từ cấu trúc datetime.
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.
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/0
hàm:
iex(1)> :erlang.now
{1487, 549978, 29683}
Điều đó đại diện cho time_t
1.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/0
hà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 System
mô-đ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 calendar
mô-đ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ờ: Date
và DateTime
. 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>
Để nhận số mili giây (Unix Timestamp):
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
Bạn cũng có thể sử dụng :os.timestamp\0
, trả về {megaseconds, seconds, microseconds}
từ UTC. :os.timestamp |> :calendar.now_to_datetime
sẽ cung cấp cho bạn bây giờ ở {{YYYY, MM, DD}, {HH, MM, SS}}
định dạng chuẩn erlang .
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_utc
thời gian hiện tại ở UTC.
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"