Skip to content

Instantly share code, notes, and snippets.

@zentrope
Created December 17, 2021 22:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zentrope/c832119d42fe4c3f28f69454278cb3e2 to your computer and use it in GitHub Desktop.
Save zentrope/c832119d42fe4c3f28f69454278cb3e2 to your computer and use it in GitHub Desktop.
DateView SwiftUI component // example
//
// DateView.swift
//
import SwiftUI
struct DateView: View {
enum Format: String {
/// "MM-dd-yyyy hh:mm a"
case dateTimeMonthFirst = "MM-dd-yyyy hh:mm a"
/// "yyyy-MM-dd"
case dateShort = "yyyy-MM-dd"
/// "yyyy-MM-dd hh:mm a"
case dateTime = "yyyy-MM-dd hh:mm a"
/// "yyyy-MM-dd'T'HH:mm:ssZ"
case iso8601 = "yyyy-MM-dd'T'HH:mm:ssZ"
/// "MMMM d, yyyy @ hh:mm a"
case dateTimeNameLong = "MMMM d, yyyy @ hh:mm a"
/// "MMMM d, yyyy"
case dateNameMedium = "MMMM d, yyyy"
/// "MMM dd, yyyy"
case dateNameShort = "MMM dd, yyyy"
/// "EEEE, MMMM d, yyyy' - 'h:mm a"
case dateDayTimeNameLong = "EEEE, MMMM d, yyyy' - 'h:mm a"
/// "MMMM yyyy"
case dateMonthYear = "MMMM yyyy"
case overdueSince = "formatOverdue()"
}
var date: Date?
var format: Format
var body: some View {
Text(fmt(date, using: format))
}
private func fmt(_ date: Date?, using format: Format) -> String {
guard let date = date else { return "" }
if format == .overdueSince {
return formatOverdue(date)
}
let formatter = DateFormatter()
formatter.dateFormat = format.rawValue
let result = formatter.string(from: date)
return result
}
private func formatOverdue(_ date: Date) -> String {
let interval = abs(date.timeIntervalSince(Date()))
let hours = interval / 60 / 60
if hours > (3 * 24) {
return String(format: "Overdue %.0f days", hours / 24)
}
let rounding = hours < 10 ? "Overdue %.2f hours" : "Overdue %.0f hours"
return String(format: rounding, interval / 60 / 60)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment