In Bite #287, we built a small extension to Date
to allow us to format relative date strings like "10 minutes ago". We used a bunch of if
statements and built our final String
. This was a nice way to learn about working with DateComponents
, but it turns out π Foundation actually provides a class to do something similar, and it's much more powerful.
Today we'll continue our look at Foundation's date and time-related functionality with DateComponentsFormatter
. Let's dive in.
Much like its cousin DateFormatter
(Bite #286), DateComponentsFormatter
is all about converting a TimeInterval
or DateComponents
into a nicely formatted, human-readable String
. (Note: It doesn't support parsing Strings
yet. Conversions are a one way trip for now).
We'll start with a new formatter:
let formatter = DateComponentsFormatter()
Then we'll configure a few options:
formatter.unitsStyle = .full
formatter.allowedUnits = [.minute, .second]
And finally, we'll ask for a String
describing an example TimeInterval
:
formatter.string(from: 543.0) // "9 minutes, 3 seconds"
Like many Foundation types, DateComponentsFormatter
is a super customizable powerhouse. Let's try a few more options:
formatter.unitsStyle = .abbreviated
formatter.string(from: 123.0)
// "2m 3s"
formatter.unitsStyle = .short
formatter.string(from: 123.0)
// "2 min, 3 sec"
formatter.unitsStyle = .spellOut
formatter.string(from: 123.0)
// "two minutes, three seconds"
formatter.includesApproximationPhrase = true
formatter.includesTimeRemainingPhrase = true
formatter.unitsStyle = .brief
formatter.string(from: 123.0)
// "About 2min 3sec remaining"
Neat. Fun Fact: If you've ever seen a progress bar or "time remaining" bar in iOS or macOS, you've seen a DateComponentsFormatter
in action.
We've only been allowing .minutes
and .seconds
. Let's try allowing some different sets of units:
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [.minute, .second]
formatter.string(from: 1234567.0)
// "20,576 minutes, 7 seconds"
formatter.allowedUnits = [.day, .hour, .minute, .second]
formatter.string(from: 1234567.0)
// "14 days, 6 hours, 56 minutes, 7 seconds"
formatter.allowedUnits = [.day, .minute, .second]
formatter.string(from: 1234567.0)
// "14 days, 416 minutes, 7 seconds"
Neat!
These are just the very basics. Look out for some more advanced DateComponentsFormatter
fun soon.