项目主页    by: dreymonde     Star:    Fork:     


This micro-library is made for you if:

  • You have ever written something like this:
let interval: TimeInterval = 10 * 60

To represent 10 minutes.



import Time

let tenMinutes = 10.minutes
let afterTenMinutes = Date() + 10.minutes
let tenMinutesAndSome = 10.minutes + 15.seconds
let tenMinutesInSeconds = 10.minutes.inSeconds
if 10.minutes > 500.seconds {
    print("That's right")


Time is not just a bunch of Double conversion functions. The main advantage of it is that all time units are strongly-typed. So, for example:

let tenMinutes = 10.minutes

Here tenMinutes will actually be of type Interval<Minute> (not to be confused with Foundation's TimeInterval). There are seven time units available, from nanoseconds to days:

public extension Double {
    var seconds: Interval<Second> {
        return Interval<Second>(self)
    var minutes: Interval<Minute> {
        return Interval<Minute>(self)
    var milliseconds: Interval<Millisecond> {
        return Interval<Millisecond>(self)
    var microseconds: Interval<Microsecond> {
        return Interval<Microsecond>(self)
    var nanoseconds: Interval<Nanosecond> {
        return Interval<Nanosecond>(self)
    var hours: Interval<Hour> {
        return Interval<Hour>(self)
    var days: Interval<Day> {
        return Interval<Day>(self)


You can perform all basic arithmetic operations on time intervals, even of different units:

let interval = 10.minutes + 15.seconds - 3.minutes + 2.hours // Interval<Minute>
let doubled = interval * 2

let seconds = 10.seconds + 3.minutes // Interval<Second>

You can also use these operations on Date:

let oneHourAfter = Date() + 1.hours


Time intervals are easily convertible:

let twoMinutesInSeconds = 2.minutes.inSeconds // Interval<Second>

You can also convert intervals to Foundation's TimeInterval, if needed:

let timeInterval = 5.minutes.timeInterval

You can also use converted(to:) method:

let fiveSecondsInHours = 5.seconds.converted(to: Hour.self) // Interval<Hour>
// or
let fiveSecondsInHours: Interval<Hour> = 5.seconds.converted()

Although, in my opinion, you would rarely need to.


You can compare different time units as well

50.minutes < 1.hour

Creating your own time units

If, for some reason, you need to create your own time unit, that's super easy to do:

public enum Week : TimeUnit {
    public static var toTimeIntervalRatio: Double {
        return 604800

Now you can use it as any other time unit:

let fiveWeeks = Interval<Week>(5)

For the sake of convenience, don't forget to write those handy extensions:

public enum Week : TimeUnit {
    public static var toTimeIntervalRatio: Double {
        return 604800

extension Interval {
    public var inWeeks: Interval<Week> {
        return converted()

extension Double {
    public var weeks: Interval<Week> {
        return Interval<Week>(self)

extension Int {
    public var weeks: Interval<Week> {
        return Interval<Week>(Double(self))


Also available:

  • Get conversion rate:
let conversionRate = Hour.conversionRate(to: Second.self) // 3600.0
  • GCD integration:
DispatchQueue.main.asyncAfter(after: 5.seconds) {
	// do stuff


Time is in very early stage. Some stuff will probably be broken at some point.


Time is available through Carthage. To install, just write into your Cartfile:

github "dreymonde/Time" ~> 0.2.0

You can also use SwiftPM. Just add to your Package.swift:

import PackageDescription

let package = Package(
    dependencies: [
        .Package(url: "https://github.com/dreymonde/Time.git", majorVersion: 0, minor: 2),