-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathTimestamp.swift
44 lines (38 loc) · 1.26 KB
/
Timestamp.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//
// Timestamp.swift
// SwiftOrg
//
// Created by Xiaoxing Hu on 8/01/17.
// Copyright © 2017 Xiaoxing Hu. All rights reserved.
//
import Foundation
public struct Timestamp {
public let active: Bool
public let date: Date
public let repeater: String?
static func from(string: String) -> Timestamp? {
let markPattern = "\\+|\\+\\+|\\.\\+|-|--"
let pattern = "^(<|\\[)(.+?)(?: (\(markPattern))(\\d+)([hdwmy])\\s*)?(>|])$"
guard let m = string.trimmed.match(pattern) else {
return nil
}
let formater = DateFormatter()
let formats = [
"yyyy-MM-dd EEE H:mm",
"yyyy-MM-dd EEE",
]
for format in formats {
formater.dateFormat = format
// It acts differently in Linux and !Linux env
guard let date = formater.date(from: m[2]!) else { continue }
let active = m[1]! == "<"
var repeater: String? = nil
if let mark = m[3], let value = m[4], let unit = m[5] {
repeater = "\(mark)\(value)\(unit)"
}
let timestamp = Timestamp(active: active, date: date, repeater: repeater)
return timestamp
}
return nil
}
}