Impressia/Vernissage/Extensions/String+Date.swift

118 lines
4.1 KiB
Swift
Raw Normal View History

2023-01-03 14:09:22 +01:00
//
// https://mczachurski.dev
// Copyright © 2023 Marcin Czachurski and the repository contributors.
2023-03-28 10:35:38 +02:00
// Licensed under the Apache License 2.0.
2023-01-03 14:09:22 +01:00
//
2023-01-03 14:09:22 +01:00
import Foundation
extension String {
public enum DateFormatType {
/// The ISO8601 formatted year "yyyy" i.e. 1997
case isoYear
2023-01-03 14:09:22 +01:00
/// The ISO8601 formatted year and month "yyyy-MM" i.e. 1997-07
case isoYearMonth
2023-01-03 14:09:22 +01:00
/// The ISO8601 formatted date "yyyy-MM-dd" i.e. 1997-07-16
case isoDate
2023-01-03 14:09:22 +01:00
/// The ISO8601 formatted date and time "yyyy-MM-dd'T'HH:mmZ" i.e. 1997-07-16T19:20+01:00
case isoDateTime
2023-01-03 14:09:22 +01:00
/// The ISO8601 formatted date, time and sec "yyyy-MM-dd'T'HH:mm:ssZ" i.e. 1997-07-16T19:20:30+01:00
case isoDateTimeSec
2023-01-03 14:09:22 +01:00
/// The ISO8601 formatted date, time and millisec "yyyy-MM-dd'T'HH:mm:ss.SSSZ" i.e. 1997-07-16T19:20:30.45+01:00
case isoDateTimeMilliSec
2023-01-03 14:09:22 +01:00
/// The dotNet formatted date "/Date(%d%d)/" i.e. "/Date(1268123281843)/"
case dotNet
2023-01-03 14:09:22 +01:00
/// The RSS formatted date "EEE, d MMM yyyy HH:mm:ss ZZZ" i.e. "Fri, 09 Sep 2011 15:26:08 +0200"
case rss
2023-01-03 14:09:22 +01:00
/// The Alternative RSS formatted date "d MMM yyyy HH:mm:ss ZZZ" i.e. "09 Sep 2011 15:26:08 +0200"
case altRSS
2023-01-03 14:09:22 +01:00
/// The http header formatted date "EEE, dd MM yyyy HH:mm:ss ZZZ" i.e. "Tue, 15 Nov 1994 12:45:26 GMT"
case httpHeader
2023-01-03 14:09:22 +01:00
/// A generic standard format date i.e. "EEE MMM dd HH:mm:ss Z yyyy"
case standard
2023-01-03 14:09:22 +01:00
/// A custom date format string
case custom(String)
2023-01-03 14:09:22 +01:00
/// The local formatted date and time "yyyy-MM-dd HH:mm:ss" i.e. 1997-07-16 19:20:00
case localDateTimeSec
2023-01-03 14:09:22 +01:00
/// The local formatted date "yyyy-MM-dd" i.e. 1997-07-16
case localDate
2023-01-03 14:09:22 +01:00
/// The local formatted time "hh:mm a" i.e. 07:20 am
case localTimeWithNoon
2023-01-03 14:09:22 +01:00
/// The local formatted date and time "yyyyMMddHHmmss" i.e. 19970716192000
case localPhotoSave
2023-01-03 14:09:22 +01:00
case birthDateFormatOne
2023-01-03 14:09:22 +01:00
case birthDateFormatTwo
2023-01-03 14:09:22 +01:00
///
case messageRTetriveFormat
2023-01-03 14:09:22 +01:00
///
case emailTimePreview
var stringFormat: String {
2023-01-04 17:56:01 +01:00
switch self {
// handle iso Time
case .birthDateFormatOne: return "dd/MM/YYYY"
case .birthDateFormatTwo: return "dd-MM-YYYY"
case .isoYear: return "yyyy"
case .isoYearMonth: return "yyyy-MM"
case .isoDate: return "yyyy-MM-dd"
case .isoDateTime: return "yyyy-MM-dd'T'HH:mmZ"
case .isoDateTimeSec: return "yyyy-MM-dd'T'HH:mm:ssZ"
case .isoDateTimeMilliSec: return "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
case .dotNet: return "/Date(%d%f)/"
case .rss: return "EEE, d MMM yyyy HH:mm:ss ZZZ"
case .altRSS: return "d MMM yyyy HH:mm:ss ZZZ"
case .httpHeader: return "EEE, dd MM yyyy HH:mm:ss ZZZ"
case .standard: return "EEE MMM dd HH:mm:ss Z yyyy"
case .custom(let customFormat): return customFormat
// handle local Time
case .localDateTimeSec: return "yyyy-MM-dd HH:mm:ss"
case .localTimeWithNoon: return "hh:mm a"
case .localDate: return "yyyy-MM-dd"
case .localPhotoSave: return "yyyyMMddHHmmss"
case .messageRTetriveFormat: return "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
case .emailTimePreview: return "dd MMM yyyy, h:mm a"
2023-01-04 17:56:01 +01:00
}
2023-01-03 14:09:22 +01:00
}
2023-01-04 17:56:01 +01:00
}
2023-01-04 17:56:01 +01:00
func toDate(_ format: DateFormatType = .isoDate) -> Date? {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format.stringFormat
let date = dateFormatter.date(from: self)
return date
}
2023-01-04 17:56:01 +01:00
func toRelative(_ format: DateFormatType = .isoDate) -> String {
guard let date = self.toDate(format) else {
return NSLocalizedString("global.title.momentsAgo", comment: "moments ago")
}
if date.addingTimeInterval(60) > Date.now {
return NSLocalizedString("global.title.momentsAgo", comment: "moments ago")
}
let formatter = RelativeDateTimeFormatter()
2023-01-04 17:56:01 +01:00
return formatter.localizedString(for: date, relativeTo: Date.now)
}
2023-01-03 14:09:22 +01:00
}