Toolkit to parse, validate, manipulate, compare and display dates, time & timezones in Swift.
What's This?
SwiftDate is the definitive toolchain to manipulate and display dates and time zones on all Apple platform and even on Linux and Swift Server Side frameworks like Vapor or Kitura.
Over 3 million of downloads on CocoaPods.
From simple date manipulation to complex business logic SwiftDate maybe the right choice for your next project.
- ☑ Easy Date Parsing (custom formats, iso8601, rss & many more)
- ☑ Easy Date Formatting even with colloquial formatter and 140+ supported languages
- ☑ Easy math operations with time units (
2.hours + 5.minutes
...) - ☑ Intuitive components extraction (
day, hour, nearestHour, weekdayNameShort
etc.) - ☑ Derivated dates generation (
nextWeek, nextMonth, nextWeekday, tomorrow
...) - ☑ Over 20+ fine grained date comparison functions (
isToday, isTomorrow, isSameWeek, isNextYear
...) - ☑ Swift 4's Codable Support
- ☑ Random dates generation
- ☑ Fine grained date enumeration functions
- ☑ Time period support
- ☑ Convert TimeIntervals to other units (
2.hours.toUnits(.minutes)
)
and of course...
- IT'S TESTED!. As 5.x the project has 90% of code coverage (want help us? write some unit tests and make a PR)
- IT'S FULLY DOCUMENTED!, both with a complete guide and with Jazzy!
- WE LOVE PLAYGROUND! Check out our interactive playground!
Start with SwiftDate
The entire library is fully documented both via XCode method inspector and a complete markdown documentation you can found below.
Explore SwiftDate
From simple date manipulation to complex business logic SwiftDate maybe the right choice for your next project.
Let me show to you the main features of the library:
- Date Parsing
- Date Manipulation
- Date Comparsion
- Date Creation with Region (Timezone, Calendar & Locale)
- Derivated Dates
- Components Extraction
- Switch between timezones/locale and calendars
- Date Formatting
- Relative Date Formatting (fully customizable!)
- Codable Support
- Time Periods
1. Date Parsing
SwiftDate can recognize all the major datetime formats automatically (ISO8601, RSS, Alt RSS, .NET, SQL, HTTP...) and you can also provide your own formats. Creating a new date has never been so easy!
// 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)
2. Date Manipulation
Date can be manipulated by adding or removing time components using a natural language; time unit extraction is also easy and includes the support for timezone, calendar and locales!
Manipulation can be done with standard math operators and between dates, time intervals, date components and relevant time units!
// 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
3. Date Comparison
SwiftDate include an extensive set of comparison functions; you can compare two dates by granularity, check if a date is an particular day, range and practically any other comparison you ever need.
Comparison is also available via standard math operators like (>, >=, <, <=
).
// 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)
4. Date Creation with Region (Timezone, Calendar & Locale)
You can create new dates from a string, time intervals or using date components. SwiftDate offers a wide set of functions to create and derivate your dates even with random generation!
// 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)
5. Derivated Dates
Date can be also generated starting from other dates; SwiftDate includes an extensive set of functions to generate.
Over 20 different derivated dates can be created easily using dateAt()
function.
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)
// Get all mondays in Jan 2019
let mondaysInJan2019 = Date.datesForWeekday(.monday, inMonth: 1, ofYear: 2019)
// 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
6. Components Extraction
You can extract components directly from dates and it includes the right value expressed in date's region (the right timezone and set locale!).
// 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...
7. Switch between timezones/locale and calendars
You can easily convert any date to another region (aka another calendar, locale or timezone) easily! New date contains all values expressed into the destination reason
// 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"
8. Date Formatting
Date formatting is easy, you can specify your own format, locale or use any of the provided ones.
// 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"
9. Relative Date Formatting (fully customizable!)
Relative formatting is all new in SwiftDate; it supports 120+ languages with two different styles (.default, .twitter
), 9 flavours (.long, .longTime, .longConvenient, .short, .shortTime, .shortConvenient, .narrow, .tiny, .quantify
) and all of them are customizable as you need.
The extensible format allows you to provide your own translations and rules to override the default behaviour.
// 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"
10. Codable Support
Both DateInRegion
and Region
fully support the new Swift's Codable
protocol. This mean you can safely encode/decode them:
// 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)
11. Time Periods
SwiftDate integrates the great Matthew York's DateTools module in order to support Time Periods.
See Time Periods section of the documentation.
Github
link |
Stars: 6167 |
Related Packages
You may find interesting
Releases
SwiftDate 6.3.1 - (Swift 5.x+) - 2020-11-22T09:09:50
Released on 2020-11-22
CHANGES
- #763 [FIX] Minimum deployment target for iOS is set to 9.0 and tvOS to 9 for Carthage builds
SwiftDate 6.3.0 - (Swift 5.x+) - 2020-11-15T11:19:33
Released on: 2020-11-16
CHANGES
- #753 [NEW]: Added added
.dateMixed
format options totoString()
method to format dateTime with differing date and time styles. - #751 [NEW]: Added support for SPM 5.3 and Package.swift to support Xcode 12 and iOS9+.
- #728 [NEW]: Added support Swift Package
.automatic
,.static
and.dynamic
linking support in order to share same package between multiple targets. - #727 [NEW] Added
.asLocale()
toString
object to transform identifier in an NSLocale objectS. - #762 [FIX]: CocoaPods: Update podspec to iOS9 in order to fix Xcode 12 warning.
- #760 [FIX]: Minor fixes to documentation and updated to 6.3.0.
- #752 [FIX]: Avoid force unwrap in
sharedOrdinalNumberFormatter
.
SwiftDate 6.2.0 - (Swift 5.x+) - 2020-09-16T14:40:56
Released on: 2020-09-16
CHANGES
- [NEW #694] Added support forDate position between 2 dates range (positionInRange)
- [NEW #695] Added support for Swift Package Manager (SwiftPM) 5.1
- [NEW #742] Added support for non latin Serbian localization
- [FIX #749] Fixed a crash with force unwrap in TimeInterval+Formatter
- [FIX #726] Fixed date comparison using the .isSameMonth option
- [FIX #725] Fixed wrong timezone while setup a different SwiftDate.defaultRegion
- [FIX #710] Fixed grammar for Slovak translation
- [FIX #708] Fix typo in customFormatter of DataRepresentable
- [FIX #707] Fixes traditional Chinese translation
- [FIX #700] Fixed wrong behavior of dateAt(.startOfMonth)
SwiftDate 6.1.0 - (Swift 5.x+) - 2019-09-14T14:24:42
Released on: 2019-09-13
CHANGES
- #682 - [FIX] Fixed Japanese relative datetime formatting.
- #693 - [FIX] Fixed wrong result when subtracting
DateInRegion
dates. - #676 - [NEW] Added
difference()
anddifferences()
methods to get the difference between two dates expressed in variuous time components with respect to the other date as a positive integer. - #676 - [NEW] Added
dateAt(dayOfMonth:monthNumber:yearNumber:)
method to returns the date on the given day of month preserving smaller components. - #676 - [NEW] Added
dateAfter(weeks:on:)
method to returns the date after given number of weeks on the given day of week. - #676 - [NEW] Added
next(:withWeekOfMonth:andMonthNumber:)
method to returns next date with the given weekday and the given week number. - #676 - [NEW] Added
next(dayOfMonth:monthOfYear:)
method to returns the next day of month preserving smaller components (hour, minute, seconds).
SwiftDate 6.0.3 - 2019-05-11T23:05:06
Released on: 2019-05-12
CHANGES
- #670 [FIX] Fixed
toISODate()
which ignores explicitly passedRegion
instance. Now if region is passed it overrides any parsed timezone from ISO source string. - #668 [FIX] Fixed missing zero padding with
toClock()
on the first digit. - #652 [FIX] Resolved slow compiling times: moved
RelativeFormatter
's languages files to json. This currently breaks Linux compatibility because SPM does not support bundled resources. - #666 [NEW] Added
dateAt(weekdayOrdinal:weekday:monthNumber:yearNumber:)
nextWeekday()
to both Date and DateInRegion
SwiftDate 6.0.2 - 2019-04-16T17:43:46
Released on: 2019-04-16
Changes
- #656 Fixed for
ISOFormatter
optionswithoutTZSeparators
which produces empty string results if not paired withwithInternetDateTimeExtended
- #653
TimeInterval.ComponentsFormatterOptions
reverted to public visibility - #635 Better handling for language fallback in relative date formatter
- #654 Fixed an issue when compiling library on Linux using
round
function (glib/darwin) - #658 Fixed
httpFormat
format which are not valid for Unicode Technical Reference #35
SwiftDate 6.0.1 (Swift 5.0+) - 2019-03-28T07:25:56
Released on: 2019-03-28
Changes
- #650 Fixes for
RelativeFormatter.Style
visibility outside the library
SwiftDate 6.0.0 (Swift 5.0+) - 2019-03-27T22:35:41
Released on: 2019-03-27
Changes
- #648 Swift 5 / Xcode 10.2 Compatibility
- #642 Wrong
toISO()
output parsing date string from non Gregorian calendars - #643 Parsing ISO-8601 formatted week dates fails
- #646 Relative date formatting never returns the "previous" value (now supports past/future/current)
- #638 Added
RoundingStrategy
forRelativeFormatter.Gradation.Rule
- #647 HTTP Header formatter fix
SwiftDate 5.1.0 (Swift 4.0+) - 2019-01-20T12:58:58
Released on: 2019-01-20
Changelog
- #622 Added enumeration methods to get dates for a specified weekday in a date range (see 3.12 section in documentation)
- #634 Added
Month
andYear
structures with circular operation support (ie. you can remove two days frommonday
and you gotsaturday
or add two months tonovember
to getjanuary
). All of these structures along withWeekday
support localized display of the represented value. - #623 Fixed ambiguos operator error when subtracting a
Date
withTimeInterval
- #626 Fixed ISO 8601 output when current calendar is not Gregorian
- #627 Added
Asia/Saigon
inZones
enumeration - #631 Fixed RealtiveFormtter's
toRelative()
methods when no quantifier is available - #629 Fixed heuristic date guessing inside the formatter which prevents discovering wrong date
- #628 Fixed ISO8601 output when printing date along with complete time
- #619 Fixed a bug with
isInRange
whereorEqual
parameter is not passed correctly - #610 Refactoring to remove un-necessary
self
SwiftDate 5.0.13 - 2018-10-28T07:56:20
Released on: 2018-10-28
Changes
- #555 Deprecated
toString()
ofTimeInterval/Double
to usetoIntervalString()
(in order to avoid ambiguity) - #611 Removed
arc4random_uniform
to use new Swift 4.2 random APIs - #568 Add Linux support to SwiftDate (see notices on documentation)
SwiftDate 5.0.12 - 2018-10-26T19:19:55
Released on: 2018-10-26
Changes
- #521
weekdayName()
,eraName()
,quarterName()
allows to specify locale overwrite to region's locale - #596 Refactoring for
hashValue
inDateInRegion
, fixed compiler error on watchOS target - #598 Silenced Xcode 'Conversion to Swift 4.2 is available' warning
- #608 Fixed crash when using
quarterName(.short)
with a Date in 4th quarter of the year
SwiftDate 5.0.11 - 2018-10-26T15:01:23
Released on: 2018-10-26
Changes
- #597 Differences between two dates as
DateComponents
viacomponentsSince()
method inDateInRegion
- #602 Crash in
RelativeFormatter
when gradation was not found - #606 Added
ms
parameter todateBySet()
function to alter the milliseconds value of a date - #607 Fixed ambiguity for
toDate(_:region:)
with multiple formats bug - #609
isInRange
ignores granularity parameter when used with plainDate
SwiftDate 5.0.10 - 2018-10-13T12:07:01
Released on: 2018-10-08
Changes:
- #594 Support for arm64_32 architecture in Xcode 10 for Carthage
SwiftDate 5.0.9 (Swift 4.2+) - 2018-09-18T21:29:05
Released on: 2018-09-18 Swift: 4.x (4.0 and 4.2 supported)
CHANGES
FIXES
- #592 Added
.calendar
and.locale
property to configureComponentsFormatterOptions
struct to formatTimeInterval
values. - #588 Fixed some links in Documentation files
- #585 Fixed .quarter property which return always a zero value
- #586 Fixed ISO8601 parser crash with certain string configurations
- #583 Fixed broken links in
Manipulate_Date.md
documentation file - #582 Fixed
Decodable
support forDateInRegion
andcompactMap()
function. - #575 Fallback to language when language+region option for
toRelative()
function does not exists - #573 Fixed
DateInRegion(milliseconds:)
init to work with actual milliseconds values
ADDITIONS
- #574 Added customization via
ComponentsFormatterOptions
object intoString()
ofTimeInterval
formatter (in addition to closure version of the same method)
SwiftDate 5.0.7 - 2018-08-24T09:08:08
Released on: 08/24/2018
Changes
- Added
toUnit()
toTimeInterval
to extract single time component from an interval (as companion oftoUnits()
). - Removed
calendar
argument fromtoUnit()
andtoUnits()
. Value is taken from reference's dateregion.calendar
SwiftDate 5.0.6 - 2018-08-21T15:40:38
Released on: 08/21/2018
Changes
- #580 Restoring in() function for DateInRegion/Date/TimeInterval; added isInside() for Date/DateInRegion
SwiftDate 5.0.5 - 2018-08-03T16:06:40
Released on: 04/08/2018
Changes
- #561 Fixed incorrect
preWeek
andnextWeek
calculation
SwiftDate 5.0.4 - 2018-07-18T07:40:31
Released on: 18/07/2018
Changes
- #559 Fixes for Decodable protocol in DateInRegion/Region on Swift 4.2
SwiftDate 5.0.3 - 2018-07-13T07:40:56
Released on: 2017-07-13
- #560 - Build failed 5.0.2 due to SwiftLint superfluous rules
SwiftDate 5.0.2 - 2018-07-12T08:06:26
Release Notes
Release Date: 2018-07-12
- #557 Fixed Swift Package Manager (SPM) project structure
- #558 Added
ordinalDay
property toDate
andDateInRegion
(iOS 9+, macOS 10.11+) - Fixes for SwiftLint linter
- Project converted to Swift 4.2
SwiftDate 5.0.1 - 2018-07-05T19:29:57
Changes:
- #553 Methods
isAfterDate
,isBeforeDate
fromDate+Compare
extension ignoresorEqual
argument
SwiftDate 5.0.0 - 2018-07-03T20:28:13
Upgrading from Swift 4.x
SwiftDate 5.x is a complete rewrite of the library. While it introduces several new features a great part of the work is about a consistent naming of the functions: some was renamed while deprecated ones was removed.
If you miss a features or you are interested in a new one create a new Issue.
Important Note about Default Region
In SwiftDate 4.x the default region is automatically set to local regiomn, where all attributes are set automatically to the current's device's locale, timezone and calendar.
Since SwiftDate 5, in order to be more comply with Date
's default behaviour, the default region's timezone is set to GMT+0 (UTC).
If you want to restore the old behaviour just set it to Region.local
just after the launch of the app.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
SwiftDate.defaultRegion = Region.local // set region to local device attributes
// ... do something else
return true
}
Added/Removed/Replaced Methods
Date.defaultRegion
was renamed toSwiftDate.defaultRegion
and you can both read and set it.Date.setDefaultRegion(:)
was removed; useSwiftDate.defaultRegion
's setter.TimeZoneName
is nowZones
and its conform to the newZonesConvertible
protocol. All parameters (likeRegion
inits function) takes now a genericZonesConvertible
instance: this mean you can pass one of the enum values of the zone or just an instance ofTimeZone
object (or you can conform your own class to it).CalendarName
is nowCalendars
and its conform to the newCalendarConvertible
protocol. All parameters (likeRegion
inits function) takes now a genericCalendarConvertible
instance: this mean you can pass one of the enum values of the zone or just an instance ofCalendar
object (or you can conform your own class to it).LocaleName
is nowLocales
and its conform to the newLocaleConvertible
protocol. All parameters (likeRegion
inits function) takes now a genericLocaleConvertible
instance: this mean you can pass one of the enum values of the zone or just an instance ofCalendar
object (or you can conform your own class to it).Date/DateInRegion
:isBetween()
function was renamedisInRange()
Date/DateInRegion
:isAfter()
was renamed toisAfterDate()
Date/DateInRegion
:isBefore()
was renamed toisBeforeDate()
String
extension methodsdate(format:fromRegion)
anddate(formats:fromRegion)
are now replaced bytoDate(_:region)
(while similar shortcuts methods are added to parse common formats:toISODate()
,toDotNETDate()
,toRSSDate()
andtoSQLDate()
.- Removed
Int
extensionsecond,minute,hour,day,week,month,year
due to inconsistence (use plurar versionsseconds,minutes
etc. - Related dates generation is now grouped under the
dateAt()
function as enum list. ThereforenextWeekend
, `previo DateInRegion
:roundedAt()
is now replaced bydateRoundedAt()
which now compacts paramters in a single enum.DateInRegion
:startOf()
andendOf()
are now replaced bydateAtStartOf()
anddateAtEndOf()
and include support for both single and multiple units.DateInRegion
:atTime()
is now replaced bydateBySet(hour:min:secs:options)
DateInRegion
:DateInRegion
's staticdistantFuture()
anddistantPast
are nowfuture()
andpast()
DateInRegion
:next(day:)
is now part of thedateAt()
function with enum.weekday(_)
.DateInRegion
:add(components:)
is now replaced bydateByAdding(_:_:)
DateInRegion
:at(unit:value:)
andat(values:keep:)
are now replaced bydateBySet()
.nextDSTTransitionDate
property is now part of the enum ofdateAt()
recentDate()
andoldestDate()
are now callednewestIn()
andoldestIn()
TimeInterval
Extension:in(_:toDate:of:)
is now replaced bytoUnits(_:from:)
TimeInterval
Extension:string()
is now replaced bytoString()
DateTimeInterval
class is now replaced byTimePeriod
class and its descendantsDateInRegion
:dates(between:and:increment:)
to enumerate dates is now replaced byenumerateDates(from:to:increment:)
DateInRegion
: colloquial formattercolloquial(toDate:options:)
is now replaced bytoRelative(since:style:locale:)
- Formatting method
iso8601()
is nowtoISO8601()
and other methodsto..()
was added to simplify formatting task. Date/DateInRegion
: IntroducedcompareCloseTo()
to compare two dates against a precision value.- Added several shortcut methods as extensions of
String
to parse dates:toISODate()
,toDotNETDate()
,toRSSDate()
andtoSQLDate()
. - Comparison methods are now grouped by
compare()
function and a list of all available enums.
SwiftDate 4.5.0 - Swift 4 - 2017-11-26T12:06:09
CHANGELOG
- #495 Added Thai language (thanks to Thanakrit Weekhamchai)
- #492 Introduced a new
ColloquialDateFormatter
class - #503 Added
isBetween
to check if a date is inside a given dates range with passed granularity. - #505 Exposed reference date for
in()
function ofTimeInterval
. If specified conversion of the interval is aware of daylight saving time and calendar's specific dates; when not specified absolute conversion still available (only for.day,.hour,.minute,.second
components).
SwiftDate 4.4.2 - Swift 4 - 2017-10-26T17:47:06
Release Date: 2017-11-26 Zipped Version: Download 4.4.2
SwiftDate 4.4.1 - (Swift 4.x) - 2017-09-15T06:01:29
- #483 Fixes a minor issue with
NSRange
under XCode 9
SwiftDate 4.4.0 - First Swift 4.x compatible version - 2017-09-14T18:18:21
-
Release Date: 2017-09-14
-
Zipped Version for Swift 4: Download 4.4.0
-
#480 Fix for '-' operator both in
Date
andDateInRegion
classes where the result is correctly reported.
SwiftDate 4.3.0 - Latest Swift 3.x release - 2017-09-14T18:18:01
-
Release Date: 2017-09-14
-
Zipped Version for Swift 3: Download 4.3.0
-
#480 Fix for '-' operator both in
Date
andDateInRegion
classes where the result is correctly reported.
SwiftDate 4.1.11 - 2017-09-05T21:16:13
- Release Date: 2017-09-05
- Zipped Version: Download 4.1.11
Changes:
- #479 Disabled LLVM instrumentation flag to allow AppStore submitting (more info https://forums.developer.apple.com/thread/81893)
SwiftDate 4.1.10 - 2017-09-03T18:32:27
- Release Date: 2017-09-03
- Zipped Version: Download 4.1.10
Changelog:
- #472
CalendarName
now supportsRawRepresentable
protocol - #459 Fixed an issue with translation of Dutch locale
- #463
colloquial...()
functions now fallback totimeComponents...
functions whenstyle
is set to an abbreviated form (ie to return1h
) - #464 Fixed unit tests for ISO8501
- #461 Fixed translation for Slovak locale
- #470 Added Azerbaijani Latin locale (thanks to @elshad)
- #468 Fixed an issue with negative intervals in
DateTimeInterval
(regression from previous release)