🗓 DateStrings
A Swift 5 Date
extension library that adds helpful string accessors and a string based initialiser. With new methods and properties that make getting a string from a Date easy.
Locale can be handled automatically (if not provided it's handled by the device) or manually (to ensure all devices present the same locale format).
Table of contents
- Installation
- Importing The Library Into Your Project
- Usage
- Building
- Testing
- Useful Reference Material
- Changelog
- Versioning
Installation
This is Swift 5 package and makes use of Swift Package Manager (SPM) to integrate it into your Swift project.
Swift Swift Swift.
Adding via Xcode
Add the package via the following menu's whilst in your Xcode project:
File > Swift Packages > Add Package Dependency...
Paste this git repo URL into the search bar at the top:
https://github.com/othyn/DateStrings.git
Press the enter key or Next
and for the rules, if not automatically selected, select Version
as Up to Next Major
: 1.0.0
< 2.0.0
.
Hit Finish
once Xcode has downloaded and initialised the package to add it to your project.
Adding via SPM Manually
Add the following as a dependency to your Package.swift
within your project directory:
.package(url: "https://github.com/othyn/DateStrings.git", .upToNextMajor(from: "1.0.0"))
After specifying "DateStrings" as a dependency of the target in which you want to use it, run swift package update.
Importing The Library Into Your Project
Add import DateStrings
to the top of the file you wish to use the library in.
This package is an extension to the base Date
object, with all methods and properties accessible via any inherited objects or the Date
object itself.
Usage
Initialiser
There is a new initialiser that allows for quickly initialising a Date
object from a date string. You can provide a custom format for the string.
By default, the locale will be the locale of the device that the app is being run on. You can stop this by passing a fixed locale string to the method as the locale
parameter.
init(fromString dateString: String, format: String = "yyyy-MM-dd", locale: String? = nil) { ... }
This allows for the following to be used to create a Date
instance object from a string.
let date = Date(fromString: "2007-06-29")
This also allows for passing in a custom format and/or a locale.
let date = Date(fromString: "2007-06-29 23:49:59", format: "yyyy-MM-dd HH:mm:ss", locale: "en_US_POSIX")
asString
This method allows you to get the date in a format of your choosing, from a DateFormatter.Style
or a custom provided format and/or locale.
By default, the locale will be the locale of the device that the app is being run on. You can stop this by passing a fixed locale string to the method as the locale
parameter.
func asString(inStyle style: DateFormatter.Style, locale: String? = nil) -> String { ... }
func asString(inFormat format: String, locale: String? = nil) -> String { ... }
An example of the inStyle
usage:
let date = Date(fromString: "2007-06-29")
let dateFullString = date.asString(inStyle: .full)
...
Text(dateFullString) // Friday, June 29, 2007
An example of the inFormat
usage:
let date = Date(fromString: "2007-06-29 23:49:59", format: "yyyy-MM-dd HH:mm:ss")
let dateCustomString = date.asString(inFormat: "yyyy-MM-dd HH:mm:ss")
...
Text(dateCustomString) // 2007-06-29 23:49:59
toString
There is also an alternative syntax toString
, which mirrors the asString
methods exactly (uses them internally too, just maps the functions forward). Just a personal preference of naming on this one. As in, use it if you prefer the toString
method names.
An example of the inStyle
usage:
let date = Date(fromString: "2007-06-29")
let dateFullString = date.toString(inStyle: .full)
...
Text(dateFullString) // Friday, June 29, 2007
An example of the inFormat
usage:
let date = Date(fromString: "2007-06-29 23:49:59", format: "yyyy-MM-dd HH:mm:ss")
let dateCustomString = date.toString(inFormat: "yyyy-MM-dd HH:mm:ss")
...
Text(dateCustomString) // 2007-06-29 23:49:59
day
A helpful computed property for getting the day from the Date
.
let date = Date(fromString: "2007-06-29")
let day = date.day
...
Text(day) // Friday
dayShort
A helpful computed property for getting the short day from the Date
.
let date = Date(fromString: "2007-06-29")
let day = date.dayShort
...
Text(day) // Fri
dayAsSingleDigit
A helpful computed property for getting the single digit day from the Date
.
let date = Date(fromString: "2007-06-05")
let day = date.dayAsSingleDigit
...
Text(day) // 5
dayAsDoubleDigit
A helpful computed property for getting the double digit day from the Date
.
let date = Date(fromString: "2007-06-05")
let day = date.dayAsDoubleDigit
...
Text(day) // 05
month
A helpful computed property for getting the month from the Date
.
let date = Date(fromString: "2007-06-29")
let month = date.month
...
Text(month) // June
monthShort
A helpful computed property for getting the short month from the Date
.
let date = Date(fromString: "2007-06-29")
let month = date.monthShort
...
Text(month) // Jun
monthAsSingleDigit
A helpful computed property for getting the single digit month from the Date
.
let date = Date(fromString: "2007-06-29")
let month = date.monthAsSingleDigit
...
Text(month) // 6
monthAsDoubleDigit
A helpful computed property for getting the double digit month from the Date
.
let date = Date(fromString: "2007-06-29")
let month = date.monthAsDoubleDigit
...
Text(month) // 06
year
A helpful computed property for getting the year from the Date
.
let date = Date(fromString: "2007-06-29")
let year = date.year
...
Text(year) // 2007
yearShort
A helpful computed property for getting the short year from the Date
.
let date = Date(fromString: "2007-06-29")
let year = date.yearShort
...
Text(year) // 07
datestamp
A helpful computed property for getting the datestamp from the Date
.
let date = Date(fromString: "2007-06-29 10:00:00", format: "yyyy-MM-dd HH:mm:ss")
let datestamp = date.datestamp
...
Text(datestamp) // 2007-06-29 10:00:00
iso8601Python
A helpful computed property for getting the ISO 8601 Python format from the Date
.
let date = Date(fromString: "2007-06-29 10:00:00", format: "yyyy-MM-dd HH:mm:ss")
let iso8601Python = date.iso8601Python
...
Text(iso8601Python) // 2007-06-29T10:00:00.000
Building
To build, use Xcode's standard build tools via ⌘ + B
or use the swift
CLI command in the project root directory:
swift build
Testing
To run the tests, use Xcode's standard test tools via ⌘ + U
or use the swift
CLI command in the project root directory:
swift test
Useful Reference Material
Below are some really useful references that I found when building this extension Library to aid with date formatting and converting formats.
Especially as Apple don't really document this themselves anywhere. Although if someone does find it, please submit a PR and correct me.
- A website that allows you to put in a date format and test date formats inline with DateFormatter and NSDateFormatter:
- https://nsdateformatter.com/
- (It also has a really handy reference/cheat sheet for all the character strings)
- Useful SO posts regarding date formats for DateFormatter and NSDateFormatter that I stumbled upon originally:
There is also something to note around how creating NSDateFormatter
and
DateFormatter
are an expensive operation, with Apple even stating so in their
2014 docs. If anyone has any ways to optimise this, I'm all ears. I've tried to be as performant as possible to what I know.
There is also an easter egg in the library for funsies, if you know what to look for.
Changelog
View the repo's releases to see the change history.