|
| 1 | +// |
| 2 | +// String+Extensions.swift |
| 3 | +// FoundationPlus |
| 4 | +// |
| 5 | +// Created by Felix Ruppert on 13.10.24. |
| 6 | +// |
| 7 | +import Foundation |
| 8 | + |
| 9 | +public extension String { |
| 10 | + /// Finds the date format in a given String and returns it as String. |
| 11 | + /// |
| 12 | + /// This method supports following date formats: |
| 13 | + /// - MM/dd/yyyy |
| 14 | + /// - yyyy-MM-dd |
| 15 | + /// - dd-MM-yyyy |
| 16 | + /// - dd.MM.yy |
| 17 | + /// - yyyy/MM/dd |
| 18 | + /// - yyyy-MM-dd'T'HH:mm:ssZ |
| 19 | + /// - yyyy-MM-dd HH:mm:ss |
| 20 | + /// - yyyy-MM-dd'T'HH:mm:ssXXXXX |
| 21 | + @available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) |
| 22 | + @inlinable var dateFormat: String { |
| 23 | + let regexes: [(Regex<(Substring, Substring)>, String)] = [ |
| 24 | + // MM/dd/yyyy e.g., 01/31/2020 |
| 25 | + (/(\d{2}\/\d{2}\/\d{4}$)/, "MM/dd/yyyy"), |
| 26 | + // yyyy-MM-dd e.g., 2020-01-31 (ISO 8601 Date) |
| 27 | + (/(\d{4}-\d{2}-\d{2}$)/, "yyyy-MM-dd"), |
| 28 | + // dd-MM-yyyy e.g., 31-01-2020 |
| 29 | + (/(\d{2}-\d{2}-\d{4}$)/, "dd-MM-yyyy"), |
| 30 | + // dd.MM.yyyy e.g., 31.01.2020 |
| 31 | + (/(\d{2}\.\d{2}\.\d{4}$)/, "dd.MM.yyyy"), |
| 32 | + // dd.MM.yy e.g., 31.01.20 |
| 33 | + (/(\d{2}\.\d{2}\.\d{2}$)/, "dd.MM.yy"), |
| 34 | + // yyyy/MM/dd e.g., 2020/01/31 |
| 35 | + (/(\d{4}\/\d{2}\/\d{2}$)/, "yyyy/MM/dd"), |
| 36 | + // ISO 8601 Date and Time e.g., 2020-01-31T15:20:30Z |
| 37 | + (/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}\:\d{2}Z?$)/, "yyyy-MM-dd'T'HH:mm:ssZ"), |
| 38 | + (/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}\:\d{2}?$)/, "yyyy-MM-dd HH:mm:ss"), |
| 39 | + // ISO 8601 Date and Time with Timezone e.g., 2020-01-31T15:20:30+00:00 |
| 40 | + (/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[\+\-]\\d{2}:\d{2}$)/, "yyyy-MM-dd'T'HH:mm:ssXXXXX") |
| 41 | + ] // Date contains 2 dots |
| 42 | + for regex in regexes { |
| 43 | + if contains(regex.0) { |
| 44 | + return regex.1 |
| 45 | + } |
| 46 | + } |
| 47 | + return "dd.MM.yyyy" |
| 48 | + } |
| 49 | +} |
0 commit comments