time
time copied to clipboard
Robust and type-safe date and time calculations for Swift
Time
Time is a Swift package that makes dealing with calendar values a natural and straight-forward process.
Working with calendars can be extremely complicated and error-prone. Time solves these problems by clarifying concepts and restricting improper usage through type-safe APIs.
Installing
Time can be installed like any other Swift package. Add this to the dependencies section of your Package.swift:
.package(url: "https://github.com/davedelong/time", from: "0.9.1")
The Basics
Here's the TL;DR of the documentation:
-
If you want to know what time it is, you need a
Clock. You can get the device's clock by usingClocks.system. -
A
Clockcan tell you the current time via some functions. For example,.today()will give you the current calendar day..thisMinute()will give you the current time, accurate down to the minute level. -
Each of these returned values has methods to retrieve more- and less- precise values. For example,
today.hours()will give you a sequence of all the "Hour" values in the day. -
These values also are how you format them into human-readable strings (via the
.format(...)method)
Some Small Examples
There are some examples below showing a sneak peek of what you can do with Time.
Fetching the Current Time
let clock = Clocks.system
// retrieve the current instantaneous time from the clock
let now = clock.thisInstant()
// retrieve the current calendar day, as defined by the user's region
let today = clock.today()
More information in "Clock".
Converting Between Regions
let nycTimeZone = TimeZone(identifier: "America/New_York")!
let myClock = Clocks.system
let nycClock = myClock.converting(to: nycTimeZone)
let myLocalTime = myClock.thisMinute() // Ex: 28 Feb 2020 at 3:14 PM Pacific Time
let nycLocalTime = nycClock.thisMinute() // Ex: 28 Feb 2020 at 6:14 PM Eastern Time
More information in "Clock".
Retrieving Components
let today: Absolute<Day> = myClock.today()
let year = today.year // Ex: 2020
let month = today.month // Ex: 2
let day = today.day // Ex: 28
More information in "TimePeriod".
Calculating Differences
let day1: Absolute<Day> = ...
let day2: Absolute<Day> = ...
// compute the difference in days, months, years, and eras
let difference: TimeDifference<Day, Era> = day1.difference(to: day2)
// or conveniently the number of calendar days between the two values
let daysDifference = day1.differenceInDays(to: day2)
More information in "Differences".
Iterating Over TimePeriods
let thisMonth = Clocks.system.thisMonth()
let daysInThisMonth = thisMonth.days()
for day in daysInThisMonth {
// …
}
More information in "Iterating Over TimePeriods".
Formatting TimePeriods
let today: Absolute<Day> = ...
let fullYearString = today.format(date: .full) // Ex: February 28, 2020
let shortYearString = today.format(year: .twoDigits, month: .full) // Ex: February '20
More information in "Formatting TimePeriods".
Observing time changes
let clock: Clock = ...
clock
.chime(every: .seconds(5))
.sink { (value: Absolute<Second>) in
print("Another 5 seconds have passed")
}
.store(in: &cancellables)
More information in "Observing time changes".
Detailed Information
For more information, please see the documentation.