DEV Community

Luis Filipe Pedroso
Luis Filipe Pedroso

Posted on • Edited on

Formatting Relative Time in Swift: Quick Guide

In Swift, there are several ways to work with date formatting, such as DateComponentsFormatter and RelativeDateTimeFormatter.

DateComponentsFormatter

  • Formats a time interval (duration) between two points in time.
  • It doesn’t know whether it’s past or future, only the length of time.
  • Example outputs: 2d, 1 hour, 5 minutes, 3h 15m
  • Use it for: durations, timers, countdowns, video lengths, etc.

RelativeDateTimeFormatter

  • Formats a date relative to another date, automatically handling past or future.
  • Adds natural language like “ago” or “in”.
  • Example outputs: 2 days ago, in 3 hours, yesterday, tomorrow
  • Use it for: human-readable time expressions like “5m ago” or “in 2d”.

Quick Comparison

Purpose Formatter Example
Duration (no direction) DateComponentsFormatter 2d, 3h 15m
Relative time (with context) RelativeDateTimeFormatter 2 days ago, in 3 hours

Example of usage

DateComponentsFormatter:

private var abbreviatedFormatter: DateComponentsFormatter { let formatter = DateComponentsFormatter() formatter.allowedUnits = [.minute, .hour, .day] formatter.unitsStyle = .abbreviated formatter.maximumUnitCount = 1 return formatter } func asAbbreviatedString() -> String { let from = Date().timeIntervalSince(self) return abbreviatedFormatter.string(from: from) ?? "" } 
Enter fullscreen mode Exit fullscreen mode

RelativeDateTimeFormatter:

private var shortFormatter: RelativeDateTimeFormatter { let formatter = RelativeDateTimeFormatter() formatter.unitsStyle = .full return formatter } func asShortString() -> String { return shortFormatter.localizedString(for: self, relativeTo: Date()) } 
Enter fullscreen mode Exit fullscreen mode

Pro tip

Create an extension and add these shorthand functions to it.

extension Date { private var abbreviatedFormatter: DateComponentsFormatter { let formatter = DateComponentsFormatter() formatter.allowedUnits = [.minute, .hour, .day] formatter.unitsStyle = .abbreviated formatter.maximumUnitCount = 1 return formatter } private var shortFormatter: RelativeDateTimeFormatter { let formatter = RelativeDateTimeFormatter() formatter.unitsStyle = .full return formatter } func asAbbreviatedString() -> String { let from = Date().timeIntervalSince(self) return abbreviatedFormatter.string(from: from) ?? "" } func asShortString() -> String { return shortFormatter.localizedString(for: self, relativeTo: Date()) } } 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)