SwiftDate新版本有一些重大更新,刪除了原DateFormat,而且增長了一些新的東西。git
SwiftDate可以自動識別主流的時間格式(ISO8601, RSS, Alt RSS, .NET, SQL, HTTP...),你也能夠手動指定格式。建立一個新的Date從未如此簡單過。github
// All default datetime formats (15+) are recognized automatically let _ = "2010-05-20 15:30:00".toDate() // You can also provide your own format! let _ = "2010-05-20 15:30".toDate("yyyy-MM-dd HH:mm") // All ISO8601 variants are supported too with timezone parsing! let _ = "2017-09-17T11:59:29+02:00".toISODate() // RSS, Extended, HTTP, SQL, .NET and all the major variants are supported! let _ = "19 Nov 2015 22:20:40 +0100".toRSS(alt: true)
能夠經過使用天然語言添加或刪除時間組件來操縱日期。時間擴展工具簡單方便,並且支持經常使用的時區、日曆、本地操做。
可使用標準數學運算符對日期、時間間隔、日期組件和相關時間單位之間進行操做!express
// Math operations support time units let _ = ("2010-05-20 15:30:00".toDate() + 3.months - 2.days) let _ = Date() + 3.hours let _ = date1 + [.year:1, .month:2, .hour:5] let _ = date1 + date2 // extract single time unit components from date manipulation let over1Year = (date3 - date2).year > 1
SwiftDate包含一組全面的比較函數;你能夠按粒度比較兩個日期,檢查日期是不是某一天,某一範圍以及您實際須要的任何其餘比較。
依然能夠經過標準數學運算符(>,> =,<,<=)進行比較。swift
// Standard math comparison is allowed let _ = dateA >= dateB || dateC < dateB // Complex comparisons includes granularity support let _ = dateA.compare(toDate: dateB, granularity: .hour) == .orderedSame let _ = dateA.isAfterDate(dateB, orEqual: true, granularity: .month) // > until month granularity let _ = dateC.isInRange(date: dateA, and: dateB, orEqual: true, granularity: .day) // > until day granularity let _ = dateA.earlierDate(dateB) // earlier date let _ = dateA.laterDate(dateB) // later date // Check if date is close to another with a given precision let _ = dateA.compareCloseTo(dateB, precision: 1.hours.timeInterval // Compare for relevant events: // .isToday, .isYesterday, .isTomorrow, .isWeekend, isNextWeek // .isSameDay, .isMorning, .isWeekday ... let _ = date.compare(.isToday) let _ = date.compare(.isNight) let _ = date.compare(.isNextWeek) let _ = date.compare(.isThisMonth) let _ = date.compare(.startOfWeek) let _ = date.compare(.isNextYear) // ...and MORE THAN 30 OTHER COMPARISONS BUILT IN // Operation in arrays (oldestIn, newestIn, sortedByNewest, sortedByOldest...) let _ = DateInRegion.oldestIn(list: datesArray) let _ = DateInRegion.sortedByNewest(list: datesArray)
您能夠從字符串,時間間隔或使用日期組件建立新日期。 SwiftDate提供了一系列功能來建立和推倒您的日期,甚至隨機生成!安全
// All dates includes timezone, calendar and locales! // Create from string let rome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian) let date1 = DateInRegion("2010-01-01 00:00:00", region: rome)! // Create date from intervals let _ = DateInRegion(seconds: 39940, region: rome) let _ = DateInRegion(milliseconds: 5000, region: rome) // Date from components let _ = DateInRegion(components: { $0.year = 2001 $0.month = 9 $0.day = 11 $0.hour = 12 $0.minute = 0 }, region: rome) let _ = DateInRegion(year: 2001, month: 1, day: 5, hour: 23, minute: 30, second: 0, region: rome) // Random date generation with/without bounds let _ = DateInRegion.randomDate(region: rome) let _ = DateInRegion.randomDate(withinDaysBeforeToday: 5) let _ = DateInRegion.randomDates(count: 50, between: lowerLimitDate, and: upperLimitDate, region: rome)
也能夠從其餘日期開始生成日期,SwiftDate包含一組普遍的構造函數。 使用dateAt()
函數能夠輕鬆建立20多個不一樣的派生日期。dom
let _ = DateInRegion().dateAt(.endOfDay) // today at the end of the day // Over 20 different relevant dates including .startOfDay, // .endOfDay, .startOfWeek, .tomorrow, .nextWeekday, .nextMonth, .prevYear, .nearestMinute and many others! let _ = dateA.nextWeekday(.friday) // the next friday after dateA let _ = (date.dateAt(.startOfMonth) - 3.days) let _ = dateA.compare(.endOfWeek) // Enumerate dates in range by providing your own custom // increment expressed in date components let from = DateInRegion("2015-01-01 10:00:00", region: rome)! let to = DateInRegion("2015-01-02 03:00:00", region: rome)! let increment2 = DateComponents.create { $0.hour = 1 $0.minute = 30 $0.second = 10 } // generate dates in range by incrementing +1h,30m,10s each new date let dates = DateInRegion.enumerateDates(from: fromDate2, to: toDate2, increment: increment2) // Altering time components let _ = dateA.dateBySet(hour: 10, min: 0, secs: 0) // Truncating a date let _ = dateA.dateTruncated(at: [.year,.month,.day]) // reset all time components keeping only date // Rounding a date let _ = dateA.dateRoundedAt(.toMins(10)) let _ = dateA.dateRoundedAt(.toFloor30Mins) // Adding components let _ = dateA.dateByAdding(5,.year) // Date at the start/end of any time component let _ = dateA.dateAtEndOf(.year) // 31 of Dec at 23:59:59 let _ = dateA.dateAtStartOf(.day) // at 00:00:00 of the same day let _ = dateA.dateAtStartOf(.month) // at 00:00:00 of the first day of the month
您能夠直接從日期中提取組件,它包括在日期區域中表示的確切值(正確時區和區域設置!)。ide
// Create a date in a region, London but with the lcoale set to IT let london = Region(calendar: .gregorian, zone: .europeLondon, locale: .italian) let date = DateInRegion("2018-02-05 23:14:45", format: dateFormat, region: london)! // You can extract any of the all available time units. // VALUES ARE EXPRESSED IN THE REGION OF THE DATE (THE RIGHT TIMEZONE). // (you can still get the UTC/absolute value by getting the inner's absoluteDate). let _ = date.year // 2018 let _ = date.month // 2 let _ = date.monthNameDefault // 'Febbraio' as the locale is the to IT! let _ = date.firstDayOfWeek // 5 let _ = date.weekdayNameShort // 'Lun' as locale is the to IT // ... all components are supported: .year, .month, .day, .hour, .minute, .second, // .monthName, .weekday, .nearestHour, .firstDayOfWeek. .quarter and so on...
您能夠輕鬆地將任何日期轉換爲其餘區域(或者其餘日曆、區域、時區設置)! 新日期包含表示爲目標緣由的全部值。函數
// Conversion between timezones is easy using convertTo(region:) function let rNY = Region(calendar: Calendars.gregorian, zone: Zones.americaNewYork, locale: Locales.english) let rRome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian) let dateInNY = "2017-01-01 00:00:00".toDate(region: rNY) let dateInRome = dateInNY?.convertTo(region: rRome)! print(dateInRome.toString()) // "dom gen 01 06:00:00 +0100 2017\n" // You can also convert single region's attributes let dateInIndia = dateInNY?.convertTo(timezone: Zones.indianChristmas, locale: Locales.nepaliIndia) print("\(dateInIndia!.toString())") // "आइत जनवरी ०१ १२:००:०० +0700 २०१७\n"
日期格式很簡單,您能夠指定本身的格式,區域設置或使用任何提供的格式。工具
// Date Formatting let london = Region(calendar: .gregorian, zone: .europeLondon, locale: .english) let date = ... // 2017-07-22T18:27:02+02:00 in london region let _ = date.toDotNET() // /Date(1500740822000+0200)/ let _ = date.toISODate() // 2017-07-22T18:27:02+02:00 let _ = date.toFormat("dd MMM yyyy 'at' HH:mm") // "22 July 2017 at 18:27" // You can also easily change locale when formatting a region let _ = date.toFormat("dd MMM", locale: .italian) // "22 Luglio" // Time Interval Formatting as Countdown let interval: TimeInterval = (2.hours.timeInterval) + (34.minutes.timeInterval) + (5.seconds.timeInterval) let _ = interval.toClock() // "2:34:05" // Time Interval Formatting by Components let _ = interval.toString { $0.maximumUnitCount = 4 $0.allowedUnits = [.day, .hour, .minute] $0.collapsesLargestUnit = true $0.unitsStyle = .abbreviated } // "2h 34m"
相對格式化是SwiftDate中的全新內容;它支持120多種語言,有兩種不一樣的風格(.default
,.twitter
),9種特例(.long
,.longTime
,.longConvenient
,.short
,.shortTime
,.shortConvenient
,.narrow
,.tiny
,.quantify
)並且它們全均可以根據您的須要進行定製。 可擴展格式容許您提供本身的轉換和規則以覆蓋默認行爲。編碼
// Twitter Style let _ = (Date() - 3.minutes).toRelative(style: RelativeFormatter.twitterStyle(), locale: Locales.english) // "3m" let _ = (Date() - 6.minutes).toRelative(style: RelativeFormatter.twitterStyle(), locale: Locales.italian) // "6 min fa" // Default Style let _ = (now2 - 5.hours).toRelative(style: RelativeFormatter.defaultStyle(), locale: Locales.english) // "5 hours ago" let y = (now2 - 40.minutes).toRelative(style: RelativeFormatter.defaultStyle(), locale: Locales.italian) // "45 minuti fa"
DateInRegion
和Region
都徹底支持新的Swift的Codable
協議。 這意味着您能夠安全地編碼/解碼它們:
// Encoding/Decoding a Region let region = Region(calendar: Calendars.gregorian, zone: Zones.europeOslo, locale: Locales.english) let encodedJSON = try JSONEncoder().encode(region) let decodedRegion = try JSONDecoder().decode(Region.self, from: encodedJSON) // Encoding/Decoding a DateInRegion let date = DateInRegion("2015-09-24T13:20:55", region: region) let encodedDate = try JSONEncoder().encode(date) let decodedDate = try JSONDecoder().decode(DateInRegion.self, from: encodedDate)
SwiftDate集成了高手Matthew York的DateTools
模塊,以支持時間段。
請參閱文檔的「時間段」部分。