Date: τι είναι, τύπος ώρας και TimeInterval στο Foundation

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-12 Χρόνος ανάγνωσης: 7 λεπ

Date — είναι μια δομή Foundation που αντιπροσωπεύει μια συγκεκριμένη χρονική στιγμή ανεξάρτητα από ημερολόγιο και ζώνη ώρας. Ο τύπος αποθηκεύει τον αριθμό δευτερολέπτων που έχουν παρέλθει από την ημερομηνία αναφοράς 1 Ιανουαρίου 2001 (reference date) και παρέχει βασικές λειτουργίες σύγκρισης και υπολογισμού χρονικών διαστημάτων. Σύμφωνα με το Apple Developer Documentation (2025), το Date χρησιμοποιείται σε όλα τα πλαίσια της Apple: από UIKit και SwiftUI έως CloudKit και Core Data. Η κατανόηση της λειτουργίας του Date είναι υποχρεωτική για κάθε προγραμματιστή iOS, καθώς χωρίς αυτό είναι αδύνατη η διαχείριση του χρόνου σε μια εφαρμογή.

Κύρια σημεία

  • Date — δομή Foundation που αποθηκεύει μια απόλυτη χρονική στιγμή ως αριθμό δευτερολέπτων από το reference date.
  • TimeInterval — τύπος Double για αναπαράσταση του διαστήματος μεταξύ δύο χρονικών στιγμών σε δευτερόλεπτα.
  • Date() — αρχικοποιητής που δημιουργεί ένα αντικείμενο με την τρέχουσα χρονική στιγμή κατά την κλήση.
  • Σύγκριση ημερομηνιών εκτελείται μέσω τελεστών σύγκρισης ή μεθόδων compare, earlierDate, laterDate.
  • DateFormatter — υποχρεωτικό στοιχείο για την εμφάνιση της ημερομηνίας στον χρήστη σε αναγνώσιμη μορφή.

Τι είναι το Date στο Foundation;

Date — είναι ένας τύπος τιμής από το πλαίσιο Foundation που καταγράφει μια απόλυτη χρονική στιγμή. Σε αντίθεση με τις ημερολογιακές αναπαραστάσεις (έτος, μήνας, ημέρα), το Date δεν εξαρτάται από τη ζώνη ώρας και το ημερολογιακό σύστημα — είναι μια καθαρά αριθμητική τιμή χρονικής σφραγίδας.

Η εσωτερική αναπαράσταση του Date είναι ένα TimeInterval (ψευδώνυμο για Double) που αποθηκεύει τον αριθμό δευτερολέπτων σε σχέση με την ημερομηνία αναφοράς — 1 Ιανουαρίου 2001 00:00:00 UTC. Η Apple επέλεξε αυτήν την ημερομηνία αντί για Unix epoch (1970) για συμβατότητα με παλαιά συστήματα NeXTSTEP, στα οποία βασίζονται τα iOS και macOS.

Το Date χρησιμοποιείται ως τυπικός τύπος ώρας σε όλα τα API της Apple: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Χωρίς Date, είναι αδύνατο να εργαστείτε με χρονοδιαγράμματα, χρονομετρητές, συμβάντα ημερολογίου, σειριοποίηση δεδομένων και οποιεσδήποτε λειτουργίες που σχετίζονται με τον χρόνο.

Date έναντι άλλων τύπων χρόνου

Date διαφέρει από τους ημερολογιακούς τύπους στο ότι αντιπροσωπεύει μια φυσική χρονική σφραγίδα, όχι μια τιμή αναγνώσιμη από τον άνθρωπο. Η ίδια Date μπορεί να αντιστοιχεί σε διαφορετικές ημερολογιακές ημερομηνίες σε διαφορετικές ζώνες ώρας. Για τη λήψη στοιχείων (έτος, μήνας, ημέρα), η Date μετατρέπεται μέσω Calendar και DateComponents.

Date διαφέρει επίσης από το DispatchTime, το οποίο χρησιμοποιείται για την αποστολή εργασιών στο Grand Central Dispatch. Το DispatchTime είναι σχετικό με τη στιγμή εκκίνησης του συστήματος, ενώ το Date είναι μια απόλυτη σφραγίδα που μπορεί να αποθηκευτεί, να μεταδοθεί και να αποκατασταθεί.

Δημιουργία Date στο Swift

Date() — είναι ο απλούστερος τρόπος δημιουργίας ενός αντικειμένου με την τρέχουσα χρονική στιγμή. Ο αρχικοποιητής χωρίς ορίσματα επιστρέφει τον ακριβή χρόνο κλήσης. Για τη δημιουργία ημερομηνίας στο παρελθόν ή το μέλλον, χρησιμοποιούνται το TimeInterval και η μέθοδος addingTimeInterval ή η αρχικοποίηση από μια υπάρχουσα Date.

Για τη δημιουργία μιας αυθαίρετης ημερομηνίας από στοιχεία, χρησιμοποιείται το ζεύγος Calendar και DateComponents. Το Calendar μετατρέπει τα αναγνώσιμα από τον άνθρωπο στοιχεία (έτος, μήνας, ημέρα, ώρα, λεπτό) σε Date. Επίσης, μπορεί κανείς να αρχικοποιήσει Date μέσω ISO8601DateFormatter από μια συμβολοσειρά σε μορφή ISO 8601 ή μέσω DateFormatter από μια αυθαίρετη αναπαράσταση συμβολοσειράς.

Date.distantPast και Date.distantFuture — δύο στατικές ιδιότητες που αντιπροσωπεύουν απείρως μακρινές στιγμές του παρελθόντος και του μέλλοντος. Χρησιμοποιούνται ως οριακές τιμές κατά το φιλτράρισμα και την ταξινόμηση ημερομηνιών σε αλγορίθμους.

swift
import Foundation

// Δημιουργία Date με τρέχοντα χρόνο
let now = Date()
print("Current time: \(now)")

// Ημερομηνία σε 1 ώρα (3600 δευτερόλεπτα)
let inOneHour = now.addingTimeInterval(3600)

// Ημερομηνία από στοιχεία
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!

Στο παράδειγμα εμφανίζονται τρεις τρόποι δημιουργίας Date: τρέχων χρόνος, προσθήκη διαστήματος και δημιουργία μέσω DateComponents. Και οι τρεις προσεγγίσεις επιστρέφουν μια τιμή τύπου Date με ακρίβεια χιλιοστού του δευτερολέπτου. Το Calendar.current χρησιμοποιεί το ημερολόγιο συστήματος του χρήστη — σε συσκευές Apple είναι συνήθως το Γρηγοριανό ημερολόγιο.

TimeInterval και σύγκριση ημερομηνιών

TimeInterval — είναι ένα ψευδώνυμο για Double που αντιπροσωπεύει τον αριθμό δευτερολέπτων μεταξύ δύο χρονικών στιγμών. Η ακρίβεια του TimeInterval φτάνει σε κλάσματα του χιλιοστού του δευτερολέπτου, που είναι επαρκής για τις περισσότερες εφαρμοστέες εργασίες. Μια αρνητική τιμή TimeInterval υποδεικνύει το παρελθόν σε σχέση με το σημείο αναφοράς.

Το Date υποστηρίζει όλους τους τυπικούς τελεστές σύγκρισης: ==, <, >, <=, >=. Το Swift συγκρίνει αυτόματα το εσωτερικό TimeInterval των τιμών. Η μέθοδος compare επιστρέφει ένα ComparisonResult με τις παραλλαγές .orderedSame, .orderedAscending, .orderedDescending για πιο ρητή σύγκριση.

Date.distance(to:) — μέθοδος που επιστρέφει TimeInterval έως την καθορισμένη ημερομηνία. Εάν η ημερομηνία-στόχος είναι στο παρελθόν, το αποτέλεσμα είναι αρνητικό. advanced(by:) δημιουργεί μια νέα ημερομηνία προσθέτοντας το καθορισμένο TimeInterval στην τρέχουσα ημερομηνία. Αυτές οι μέθοδοι υλοποιούν το πρωτόκολλο Strideable, επιτρέποντας τη χρήση Date σε εύρη Range και ClosedRange.

swift
let start = Date()
let end = start.addingTimeInterval(86400)

// Σύγκριση μέσω τελεστών
if start < end {
    print("start is earlier")
}

// TimeInterval μεταξύ δύο ημερομηνιών
let interval: TimeInterval = end.timeIntervalSince(start)
print("Seconds: \(Int(interval / 60)) minutes")

// Using Date in range
let range = start...end
let mid = start.addingTimeInterval(43200)
if range.contains(mid) {
    print("mid is between start and end")
}

Το TimeInterval ίσο με 86400 αντιστοιχεί σε μία ημέρα. Για πιο σύνθετα διαστήματα — εβδομάδες, μήνες, έτη — χρησιμοποιήστε Calendar και DateComponents, καθώς αυτές οι μονάδες έχουν μεταβλητό μήκος (δίσεκτα έτη, αλλαγή θερινής ώρας). Το TimeInterval εφαρμόζεται μόνο για σταθερά διαστήματα σε δευτερόλεπτα.

Calendar και DateComponents

Calendar — είναι η γέφυρα μεταξύ Date και αναγνώσιμων από τον άνθρωπο στοιχείων. Το Calendar μετατρέπει Date σε DateComponents (έτος, μήνας, ημέρα, ώρα, λεπτό, δευτερόλεπτο) λαμβάνοντας υπόψη τη ζώνη ώρας και τις τοπικές ρυθμίσεις. Χωρίς Calendar, είναι αδύνατο να εξαχθεί το έτος ή ο μήνας από το Date — το Date δεν περιέχει αυτές τις πληροφορίες λόγω της απόλυτης φύσης του.

Η μέθοδος Calendar.component εξάγει ένα στοιχείο από το Date: έτος, μήνας, ημέρα, ώρα, λεπτό, δευτερόλεπτο, weekday, quarter. Η μέθοδος Calendar.dateComponents εξάγει ένα σύνολο στοιχείων σε μία κλήση — αυτό είναι πιο αποδοτικό από την ξεχωριστή κλήση του component για κάθε πεδίο.

Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday — βολικές μέθοδοι για έλεγχο σχετικών ημερομηνιών. Calendar.dateInterval επιστρέφει την αρχή και το τέλος της καθορισμένης περιόδου (ημέρα, εβδομάδα, μήνας, έτος). Calendar.compare συγκρίνει ημερομηνίες με ακρίβεια του καθορισμένου στοιχείου — για παράδειγμα, έτος χωρίς να λαμβάνει υπόψη μήνα και ημέρα.

swift
let calendar = Calendar.current

// Εξαγωγή στοιχείων
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())

// Check relative date
if calendar.isDateInToday(someDate) {
    print("Today!")
}

// Αρχή και τέλος ημέρας
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")

Calendar.current χρησιμοποιεί τις ρυθμίσεις συστήματος του χρήστη — ημερολόγιο, ζώνη ώρας και τοπικές ρυθμίσεις. Για δοκιμή ή συγκεκριμένους υπολογισμούς, μπορείτε να δημιουργήσετε ένα Calendar με συγκεκριμένες παραμέτρους μέσω Calendar(identifier: .gregorian) και να ορίσετε την επιθυμητή TimeZone μέσω της ιδιότητας timeZone.

DateFormatter και εμφάνιση ημερομηνίας

DateFormatter — υποχρεωτικό στοιχείο εάν το Date πρέπει να εμφανιστεί στον χρήστη. Το DateFormatter μετατρέπει το Date σε συμβολοσειρά σύμφωνα με την καθορισμένη μορφή και τις τοπικές ρυθμίσεις. Η άμεση μετατροπή Date σε συμβολοσειρά μέσω String(describing:) επιστρέφει μια τεχνική αναπαράσταση με reference date και TimeInterval — δεν προορίζεται για τον χρήστη.

Η βασική προσέγγιση είναι η χρήση προκαθορισμένων στυλ dateStyle και timeStyle. Το iOS υποστηρίζει τέσσερα στυλ: .short, .medium, .long, .full. Ο συνδυασμός στυλ ημερομηνίας και ώρας επιτρέπει ευέλικτη προσαρμογή της εμφάνισης. Το DateFormatter εφαρμόζει αυτόματα τον εντοπισμό: για ελληνικές τοπικές ρυθμίσεις, η ημερομηνία θα εμφανιστεί σε μορφή \"21 Ιουλίου 2026\".

ISO8601DateFormatter — ένα εξειδικευμένο formatter για ISO 8601, την πιο διαδεδομένη μορφή για API και ανταλλαγή δεδομένων. Αυτό το formatter λειτουργεί ταχύτερα από το DateFormatter και δεν εξαρτάται από τις τοπικές ρυθμίσεις, καθιστώντας το προτιμότερο για σειριοποίηση ημερομηνιών σε JSON.

swift
// Προκαθορισμένα στυλ
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())

// ISO 8601 για API
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())

// Ανάλυση από συμβολοσειρά
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!

Κατά την εργασία με DateFormatter, είναι σημαντικό να θυμάστε την απόδοση: η δημιουργία ενός νέου formatter είναι μια δαπανηρή λειτουργία. Συνιστάται η προσωρινή αποθήκευση του formatter ή η δημιουργία του μία φορά και η επαναχρησιμοποίηση. Στις ιδιότητες του formatter, μπορείτε να ορίσετε το timeZone — από προεπιλογή χρησιμοποιείται η ζώνη ώρας συστήματος, αλλά για ημερομηνίες διακομιστή συχνά απαιτείται TimeZone(identifier: \"UTC\").

Παραδείγματα χρήσης Date

Ας εξετάσουμε τυπικά σενάρια εργασίας με Date σε μια εφαρμογή iOS. Πρώτο σενάριο — υπολογισμός ηλικίας χρήστη από ημερομηνία γέννησης. Δεύτερο — χρονομετρητής αντίστροφης μέτρησης έως ένα συμβάν. Τρίτο — ομαδοποίηση εγγραφών κατά ημερομηνία για εμφάνιση ως ενότητες πίνακα.

Υπολογισμός ηλικίας από ημερομηνία γέννησης

Calendar.dateComponents με τη σημαία [.year] υπολογίζει τη διαφορά μεταξύ δύο ημερομηνιών. Η ρύθμιση της σωστής ζώνης ώρας είναι κρίσιμη — εάν δεν καθορίσετε timeZone στο Calendar, το αποτέλεσμα μπορεί να διαφέρει κατά μία ημέρα λόγω της διέλευσης των μεσονυχτίων σε άλλη ζώνη ώρας.

swift
func calculateAge(from birthDate: Date) -> Int {
    let calendar = Calendar.current
    let now = Date()
    let components = calendar.dateComponents(
        [.year], from: birthDate, to: now
    )
    return components.year ?? 0
}

Χρονομετρητής αντίστροφης μέτρησης υλοποιείται μέσω TimeInterval. Υπολογίζουμε τη διαφορά μεταξύ της ημερομηνίας-στόχου και της τρέχουσας ημερομηνίας, λαμβάνουμε το υπόλοιπο σε δευτερόλεπτα και το μετατρέπουμε σε ημέρες, ώρες, λεπτά. Για τακτική ενημέρωση, χρησιμοποιείται Timer με διάστημα 1 δευτερολέπτου. Το ObservableObject με ιδιότητα @Published επιτρέπει στο SwiftUI να ενημερώνει αυτόματα τη διεπαφή.

Ομαδοποίηση κατά ημερομηνία υλοποιείται μέσω λεξικού με κλειδί Date. Το Calendar.dateInterval(of: .day, for:) κανονικοποιεί την ημερομηνία στην αρχή της ημέρας, επιτρέποντας την ομαδοποίηση εγγραφών που ανήκουν στην ίδια ημέρα. Η ίδια προσέγγιση λειτουργεί για εβδομάδες, μήνες και έτη — αρκεί να αλλάξετε το στοιχείο στο dateInterval σε .weekOfYear ή .month.

ΣενάριοΒασικό APIΧαρακτηριστικό
Υπολογισμός ηλικίαςCalendar.dateComponentsΛάβετε υπόψη timeZone
Αντίστρ. μέτρησηDate.timeIntervalSinceTimer+Combine
Ομαδοποίηση ημ/νιώνCalendar.dateIntervalΚανονικοποίηση έως ημέρα
Σειριοποίηση JSONISO8601DateFormatterLocale δεν επηρεάζει

Συχνές Ερωτήσεις

Σε τι διαφέρει το Date από μια συμβολοσειρά ημερομηνίας;

Date — είναι μια εσωτερική αναπαράσταση χρόνου χωρίς σύνδεση με ημερολόγιο και τοπικές ρυθμίσεις. Η συμβολοσειρά είναι μια μορφοποιημένη εμφάνιση που εξαρτάται από τις ρυθμίσεις χρήστη. Το Date μπορεί να συγκριθεί, να σειριοποιηθεί και να υποστεί μαθηματική επεξεργασία με εκατό τοις εκατό ακρίβεια, ενώ η αναπαράσταση συμβολοσειράς απαιτεί πάντα ανάλυση μέσω formatter.

Γιατί το Date δεν περιέχει πληροφορίες σχετικά με τη ζώνη ώρας;

Date — είναι μια απόλυτη χρονική σφραγίδα (αριθμός δευτερολέπτων από το reference date) που δεν εξαρτάται από τη ζώνη ώρας. Η ζώνη ώρας είναι το πλαίσιο εμφάνισης. Η ίδια Date σε UTC και στην Αθήνα αντιπροσωπεύει την ίδια φυσική στιγμή, αλλά εμφανίζεται ως διαφορετική ημερολογιακή ώρα.

Ποιον τύπο να χρησιμοποιώ για αποθήκευση χρόνου στο Core Data;

Date υποστηρίζεται άμεσα από το Core Data ως τύπος χαρακτηριστικού. Το Core Data σειριοποιεί αυτόματα το Date στον αποθηκευτικό χώρο. Για ερωτήματα με φιλτράρισμα κατά ημερομηνία, χρησιμοποιήστε NSPredicate με τελεστές σύγκρισης — το Core Data χειρίζεται σωστά το timezone σε επίπεδο SQLite.

Ποια είναι η διαφορά μεταξύ Date και CFAbsoluteTime;

CFAbsoluteTime — είναι ένας τύπος Core Foundation που χρησιμοποιεί την ίδια ημερομηνία αναφοράς (1 Ιανουαρίου 2001). Το Date και το CFAbsoluteTime είναι εναλλάξιμα μέσω άμεσης μετατροπής. Το Date(timeIntervalSinceReferenceDate:) δέχεται CFAbsoluteTime, και το Date.timeIntervalSinceReferenceDate επιστρέφει CFAbsoluteTime.

Μπορεί το Date να χρησιμοποιηθεί για μετρήσεις υψηλής ακρίβειας;

Date έχει ακρίβεια έως χιλιοστό του δευτερολέπτου, αλλά δεν εγγυάται ακρίβεια νανοδευτερολέπτου λόγω περιορισμών υλικού iOS/macOS. Για μετρήσεις υψηλής ακρίβειας, χρησιμοποιήστε mach_absolute_time ή ContinuousClock από Swift 5.7+, τα οποία λειτουργούν σε μετρητές κύκλων επεξεργαστή υλικού.

Σύνοψη

  • Date — τύπος τιμής Foundation για αποθήκευση απόλυτης χρονικής στιγμής ως TimeInterval από το reference date 1 Ιανουαρίου 2001.
  • TimeInterval (Double) — αριθμός δευτερολέπτων μεταξύ δύο ημερομηνιών, παρέχει σύγκριση και αριθμητική με Date.
  • Calendar και DateComponents — ο μόνος τρόπος εξαγωγής έτους, μήνα, ημέρας και άλλων ημερολογιακών στοιχείων από το Date.
  • DateFormatter και ISO8601DateFormatter — υποχρεωτικά εργαλεία για εμφάνιση και σειριοποίηση ημερομηνιών σε μορφή κειμένου.
  • Date.distantPast και Date.distantFuture — οριακές τιμές για φιλτράρισμα και ταξινόμηση σε αλγορίθμους.
  • Το Date δεν περιέχει timezone — η ζώνη ώρας προστίθεται στο επίπεδο Calendar κατά την εξαγωγή στοιχείων για εμφάνιση.
  • Core Data και Codable υποστηρίζουν το Date εγγενώς, απλοποιώντας την αποθήκευση και μετάδοση ημερομηνιών χωρίς πρόσθετες μετατροπές.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης