Do you want to pick up from where you left of?
Take me there

Tanggal dan Waktu

Bekerja dengan waktu di Elixir.

Time

Elixir memiliki beberapa modul untuk bekerja dengan waktu. mari kita mulai dengan mendapatkan waktu saat ini:

iex> Time.utc_now
~T[19:39:31.056226]

Sebagai catatan kita memiliki sigil yang dapat digunakan juga untuk untuk membuat struct Time :

iex> ~T[19:39:31.056226]
~T[19:39:31.056226]

Anda dapat mempelajari lebih lanjut tentang sigils pada link berikut sigils. Berikut adalah contoh betapa mudahnya mengakses bagian-bagian dari struct sigils ini:

iex> t = ~T[19:39:31.056226]
~T[19:39:31.056226]
iex> t.hour
19
iex> t.minute
39
iex> t.day
** (KeyError) key :day not found in: ~T[19:39:31.056226]

Tetapi ada masalah: seperti yang mungkin Anda perhatikan, struct ini hanya berisi waktu dalam sehari, tidak ada data hari/bulan/tahun..

Date

Berlawanan dengan Time, struct Date memiliki info tentang tanggal, tanpa info tentang waktu.

iex> Date.utc_today
~D[2028-10-21]

Dan struct Date memiliki beberapa fungsi yang berguna untuk bekerja dengan tanggal

iex> {:ok, date} = Date.new(2020, 12, 12)
{:ok, ~D[2020-12-12]}
iex> Date.day_of_week date
6
iex> Date.leap_year? date
true

day_of_week/1 menghitung hari apa dalam seminggu pada tanggal tertentu. Dalam hal ini hari Sabtu. leap_year?/1 memeriksa apakah ini tahun kabisat. Fungsi lainnya dapat ditemukan di doc.

NaiveDateTime

Ada dua jenis struct yang berisi tanggal dan waktu sekaligus di Elixir. Yang pertama adalah NaiveDateTime yang memiliki kekurangan dalam dukungan zona waktu.

iex> NaiveDateTime.utc_now
~N[2022-01-21 19:55:10.008965]

Tetapi memiliki waktu dan tanggal, sehingga Anda dapat bermain dengan menambahkan waktu, misalnya:

iex> NaiveDateTime.add(~N[2018-10-01 00:00:14], 30)
~N[2018-10-01 00:00:44]

DateTime

Yang kedua, seperti yang mungkin sudah Anda duga dari judul bagian ini, adalah DateTime. Itu tidak memiliki batasan yang dicatat dalam NaiveDateTime: ia memiliki waktu dan tanggal, dan mendukung zona waktu. Tapi waspadalah tentang zona waktu. Dokumen resmi menyatakan:

Many functions in this module require a time zone database. By default, it uses the default time zone database returned by Calendar.get_time_zone_database/0, which defaults to Calendar.UTCOnlyTimeZoneDatabase which only handles “Etc/UTC” datetimes and returns {:error, :utc_only_time_zone_database} for any other time zone.

Perhatikan bahwa Anda dapat membuat instance DateTime dari NaiveDateTime, hanya dengan memberikan zona waktu:

iex> DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
{:ok, #DateTime<2016-05-24 13:26:08.003Z>}

Bekerja dengan Zona Waktu

Seperti yang telah kami catat di bagian sebelumnya, secara default Elixir tidak memiliki data zona waktu. Untuk mengatasi masalah ini, kita perlu menginstal dan menyiapkan paket tzdata. Setelah menginstalnya, Anda harus mengonfigurasi Elixir secara global untuk menggunakan Tzdata sebagai basis data zona waktu:

config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase

Sekarang mari kita coba membuat waktu dalam zona waktu Paris dan mengubahnya menjadi waktu New York:

iex> paris_datetime = DateTime.from_naive!(~N[2019-01-01 12:00:00], "Europe/Paris")
#DateTime<2019-01-01 12:00:00+01:00 CET Europe/Paris>
iex> {:ok, ny_datetime} = DateTime.shift_zone(paris_datetime, "America/New_York")
{:ok, #DateTime<2019-01-01 06:00:00-05:00 EST America/New_York>}
iex> ny_datetime
#DateTime<2019-01-01 06:00:00-05:00 EST America/New_York>

Seperti yang Anda lihat, waktu berubah dari 12:00 waktu Paris menjadi 6:00, yang berarti benar karena perbedaan waktu antara kedua kota adalah 6 jam.

Ini dia! Jika Anda ingin bekerja dengan fungsi lanjutan lainnya, Anda mungkin ingin mempertimbangkan untuk melihat lebih jauh ke dalam dokumen untuk Time, Date, DateTime dan NaiveDateTime Anda mungkin juga ingin mempertimbangkan Timex dan Calendar yang merupakan library yang cukup bagus untuk bekerja dengan waktu di Elixir.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!