العمل مع التواريخ في Swift (iOS/macOS): نظرة عامة على المكتبات
في التطوير لنظامي iOS وmacOS، يعد العمل مع التواريخ والوقت من المهام الأساسية. يوفر الإطار الأساسي Foundation أدوات قوية ولكنها أحيانًا ضخمة. لتبسيط الكود وزيادة قابلية القراءة، غالبًا ما يستخدم المطورون مكتبات خارجية. في هذه المقالة، سنستعرض الإمكانيات الأصلية لـ Swift (Foundation) ومكتبتين شائعتين: SwiftDate و DateTools.
1. Foundation: الإمكانيات المدمجة
تشمل الأدوات الأساسية لـ Foundation Date و DateFormatter و Calendar و TimeZone. هذا يكفي لمعظم المهام، لكنه يتطلب كودًا مطولًا.
مثال: إنشاء وتنسيق تاريخ
import Foundation
let now = Date()let formatter = DateFormatter()formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"formatter.timeZone = TimeZone(abbreviation: "UTC")let dateString = formatter.string(from: now)print(dateString) // 2025-04-01 14:30:00مثال: حساب الفرق بين التواريخ
let startDate = Date()let endDate = Calendar.current.date(byAdding: .day, value: 7, to: startDate)!let components = Calendar.current.dateComponents([.day, .hour], from: startDate, to: endDate)print("\\(components.day!) أيام, \\(components.hour!) ساعات")مزايا Foundation: لا تبعيات، تحكم كامل، دعم جميع المناطق الزمنية والتقاويم.
عيوب: كود كثير للعمليات البسيطة، تعقيد في التوطين والتواريخ النسبية.
2. SwiftDate — مكتبة قوية ومرنة
SwiftDate هي واحدة من أشهر المكتبات للعمل مع التواريخ في Swift. إنها توسع إمكانيات Foundation بإضافة طرق ملائمة للتحليل والتنسيق والمعالجات والعمل مع المناطق الزمنية.
التثبيت (مدير حزم Swift)
// Package.swiftdependencies: [ .package(url: "https://github.com/malcommac/SwiftDate.git", from: "6.3.0")]مثال: إنشاء تاريخ من سلسلة نصية
import SwiftDate
let date = "2025-04-01T14:30:00+0000".toDate()print(date?.toFormat("dd.MM.yyyy HH:mm")) // 01.04.2025 14:30مثال: التواريخ النسبية والفترات
let now = Date()let oneWeekAgo = now - 1.weeksprint(oneWeekAgo.toRelative()) // "1 week ago"
let nextMonth = now + 1.monthsprint(nextMonth.toFormat("MMMM yyyy")) // May 2025مثال: العمل مع المناطق الزمنية
let parisDate = DateInRegion(Date(), region: .init(calendar: Calendars.gregorian, zone: Zones.europeParis, locale: Locales.french))print(parisDate.toFormat("HH:mm")) // الوقت في باريسمزايا SwiftDate: بناء جملة موجز، دعم مدمج للتواريخ النسبية والمناطق والإعدادات المحلية، تحليل قوي.
عيوب: حجم المكتبة كبير (~2 ميجابايت)، قد تكون زائدة عن الحاجة للمشاريع البسيطة.
3. DateTools — البساطة وسهولة القراءة
DateTools هي مكتبة خفيفة الوزن، تركز على سهولة قراءة الكود. تضيف طرقًا إلى Date للحساب السريع للفترات والمقارنة والتنسيق.
التثبيت (CocoaPods)
pod 'DateToolsSwift'مثال: التحقق من الفترات الزمنية
import DateToolsSwift
let date1 = Date()let date2 = date1 + 2.hoursprint(date2.isToday) // trueprint(date1.earlierDate(date2) == date1) // trueمثال: سلاسل نصية مفهومة للبشر
let pastDate = Date() - 3.daysprint(pastDate.timeAgoSinceNow) // "3 days ago"
let futureDate = Date() + 1.weeksprint(futureDate.timeAgoSinceNow) // "in 1 w