Ημερομηνία και Ώρα

Αυτή η μετάφραση είναι πλήρως ενημερωμένη.

Πως δουλεύουμε με την ώρα στην Elixir

Πίνακας περιεχομένων

Time

Η Elixir έχει μερικές ενότητες για την εργασία με την ώρα. Πρέπει να σημειωθεί όμως ότι αυτή η λειτουργικότητα είναι περιορισμένη όταν δουλεύουμε με τη ζώνη ώρας UTC.

Ας ξεκινήσουμε λαμβάνοντας την τρέχουσα ώρα:

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

Σημειώστε ότι έχουμε ένα σύμβολο το οποίο μπορεί να χρησιμοπιηθεί για να δημιουργήσουμε μια δομή Time:

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

Μπορείτε να μάθετε περισσότερα για τα σύμβολα στο σχετικό μάθημα. Η πρόσβαση σε μέρη της δομής αυτής είναι εύκολη:

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]

Όμως υπάρχει μια παγίδα: όπως θα παρατηρήσατε, αυτή η δομή περιέχει μόνο την ώρα μέσα σε μια ημέρα, δεν υπάρχουν δεδομένα σχετικά με την ημέρα, το μήνα ή το χρόνο.

Date

Σε αντίθεση με την Time, μια δομή Date έχει πληροφορίες για την τρέχουσα ημερομηνία, χωρίς καμμία πληροφορία για την τρέχουσα ώρα.

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

Και επίσης έχει μερικές χρήσιμες συναρτήσεις για να δουλέψει με τις ημερομηνίες:

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 υπολογίζει ποιά μέρα της εβδομάδας είναι μια συγκεκριμμένη ημέρα. Σε αυτή την περίπτωση είναι Σάββατο. Η leap_year?/1 ελέγχει αν αυτό το έτος είναι δίσεκτο. Άλλες συναρτήσεις μπορείτε να βρείτε στην τεκμηρίωση.

NaiveDateTime

Υπάρχουν δύο δομές στην Elixir οι οποίες περιέχουν ημερομηνία και ώρα μαζί. Η πρώτη είναι η NaiveDateTime. Το μειονέκτημά της είναι η έλειψη υποστήριξης για ζώνες ώρας:

iex(15)> NaiveDateTime.utc_now
~N[2029-01-21 19:55:10.008965]

Αλλά έχει ταυτόχρονα την τρέχουσα ημερομηνία και ώρα, έτσι μπορείτε να παίξετε με την προσθήκη ώρας, για παράδειγμα:

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

DateTime

Η δεύτερη, όπως μπορείτε να μαντέψετε από τον τίτλο αυτής της ενότητας, είναι η DateTime. Δεν έχει τα μειονεκτήματα που έχει η NaiveDateTime: έχει ταυτόχρονα ημερομηνία και ώρα και υποστηρίζει ζώνες ώρας. But be aware about timezones. The official docs state: Αλλά προσέξτε τις ζώνες ώρας. Η επίσημη τεκμηρίωση γράφει:

You will notice this module only contains conversion functions as well as functions that work on UTC.
This is because a proper DateTime implementation requires a time zone database which currently is not provided as part of Elixir.

Σημειώστε επίσης ότι μπορείτε να δημιουργήσετε μια δομή DateTime από μια NaiveDateTime, προσθέτοντας την ζώνη ώρας:

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

Αυτό ήταν! Αν θέλετε να δουλέψετε με άλλες πιο προχωρημένες συναρτήσεις, θα πρέπει να κοιτάξετε στην επίσημη τεκμηρίωση για τις ενότητες Time, Date, DateTime και NaiveDateTime. Θα πρέπει επίσης να λάβετε υπόψιν σας τις Timex και Calendar οι οποίες είναι πολύ δυνατές βιβλιοθήκες της Elixir σχετικά με το χρόνο.

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