العمل مع التواريخ والوقت في Swift: من الأساسيات إلى التقنيات المتقدمة
العمل مع التواريخ والوقت هي إحدى المهام الأساسية في تطوير تطبيقات iOS و macOS. توفر Swift مجموعة أدوات قوية ومرنة لهذا الغرض: Date و DateFormatter و Calendar و DateComponents و TimeInterval. في هذه المقالة، سنشرح كل منها بالتفصيل، ونعرض أمثلة عملية، ونتعلم كيفية حل المهام النموذجية مثل تنسيق التواريخ، وحساب الفرق الزمني، والعمل مع المناطق الزمنية والتقاويم.
1. الأساسيات: كلاس Date و TimeInterval
النوع الأساسي لتمثيل لحظة زمنية هو Date. يخزن عدد الثواني المنقضية منذ 1 يناير 2001 الساعة 00:00:00 UTC (التاريخ المرجعي لـ Apple).
إنشاء ومقارنة التواريخ:
import Foundation
// التاريخ والوقت الحاليlet now = Date()print("الآن: \\(now)")
// تاريخ بناءً على فاصل زمني (120 ثانية من اللحظة الحالية)let futureDate = Date(timeIntervalSinceNow: 120)print("بعد دقيقتين: \\(futureDate)")
// تاريخ بناءً على فاصل زمني ثابت من التاريخ المرجعيlet specificDate = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 365) // سنة واحدة من 2001print("تاريخ تقريبي: \\(specificDate)")
// مقارنة التواريخif now < futureDate { print("التاريخ الحالي أقدم من التاريخ المستقبلي")}TimeInterval هو مجرد اسم مستعار لـ Double، يمثل عدد الثواني. يُستخدم لحساب الفرق بين التواريخ:
let startDate = Date()sleep(2) // محاكاة تأخيرlet endDate = Date()
let elapsed: TimeInterval = endDate.timeIntervalSince(startDate)print("مر \\(elapsed) ثانية") // سيطبع ~2.0
// العملية العكسيةlet minutes: TimeInterval = 5 * 60let fiveMinutesLater = Date(timeInterval: minutes, since: startDate)2. تنسيق التواريخ باستخدام DateFormatter
لعرض التاريخ للمستخدم بشكل مفهوم، يُستخدم DateFormatter. يدعم التوطين والعديد من الأنماط.
التنسيق الأساسي:
let formatter = DateFormatter()formatter.locale = Locale(identifier: "ar_SA") // لغة عربية (السعودية)formatter.timeZone = TimeZone.current // المنطقة الزمنية الحالية
// الأنماط القياسيةformatter.dateStyle = .fullformatter.timeStyle = .shortprint(formatter.string(from: Date())) // مثال: "الجمعة، 24 فبراير 2025 م، 2:30 م"
formatter.dateStyle = .mediumformatter.timeStyle = .noneprint(formatter.string(from: Date())) // "24 فبراير 2025 م"تنسيق مخصص:
formatter.dateFormat = "dd.MM.yyyy HH:mm"print(formatter.string(from: Date())) // "24.02.2025 14:30"
// تحليل سلسلة نصية إلى تاريخlet dateString = "25.12.2024 10:00"if let parsedDate = formatter.date(from: dateString) { print("تم تحليل التاريخ: \\(parsedDate)")}هام: عند التحليل، تحقق دائمًا من أن date(from:) لا يُرجع nil. تنسيق السلسلة غير الصحيح أو عدم تطابق اللغة سيؤدي إلى خطأ.
3. الحسابات التقويمية: Calendar و DateComponents
كلاس Calendar يغلف معلومات النظام التقويمي (ميلادي، إسلامي، بوذي، إلخ) ويسمح بإجراء عمليات معقدة على التواريخ. يُستخدم DateComponents لوصف المكونات الفردية للتاريخ (السنة، الشهر، اليوم، الساعة، إلخ).
استخراج المكونات:
let calendar = Calendar.currentlet components = calendar.dateComponents([.year, .month, .day, .weekday], from: Date())
print("السنة: \\(components.year!)")print("الشهر: \\(components.month!)")print("اليوم: \\(components.day!)")print("يوم الأسبوع: \\(components.weekday!)") // 1 - الأحد، 2 - الإثنين...