How to get 1 hour ago from a date in iOS swift?

前端 未结 13 763
一向
一向 2020-12-04 13:35

I have been researching, but I couldnt find exact solution for my problem. I have been trying to get 1 hour ago from a date. How can I achieve this in swift?

13条回答
  •  庸人自扰
    2020-12-04 13:41

    Details

    • Xcode 11.4 (11E146), Swift 5.2

    Solution

    import Foundation
    
    extension Date {
    
        typealias Component = (value: Int, type: Calendar.Component)
    
        init?(bySubtracting components: Component..., calendar: Calendar = Calendar.current, from date: Date) {
            guard let date = date.subtract(components, calendar: calendar) else { return nil }
            self = date
        }
    
        func subtract(_ components: Component..., calendar: Calendar = Calendar.current) -> Date? {
            subtract(components, calendar: calendar)
        }
    
        func subtract(_ components: [Component], calendar: Calendar = Calendar.current) -> Date? {
            components.reduce(self) { (result, component) -> Date? in
                guard let date = result else { return nil }
                return calendar.date(byAdding: component.type, value: (-1)*component.value, to: date)
            }
        }
    
        static func beforeNow(difference component: Component..., calendar: Calendar = Calendar.current) -> Date? {
            Date().subtract(component, calendar: calendar)
        }
    
        static func beforeNow(difference component: [Component], calendar: Calendar = Calendar.current) -> Date? {
            Date().subtract(component, calendar: calendar)
        }
    }
    
    extension Date {
        static func - (date: Date, component: Date.Component) -> Date? { date.subtract(component, calendar: Calendar.current) }
        static func -= (date: inout Date, component: Date.Component) {
            guard let newDate = date.subtract(component, calendar: Calendar.current) else { return }
            date = newDate
        }
    }
    

    Usage

    var currentDate = Date()
    let date1 = Date(bySubtracting: (30, .day), from: currentDate)
    
    let date2 = Date().subtract((30, .day))
    
    let date3 = Date().subtract([(1, .minute), (2, .hour), (3, .day), (4, .month)])
    
    let component = Date.Component(value: 1, type: .day)
    let date4 = Date.beforeNow(difference: component)
    
    let date5 = Date.beforeNow(difference: (1, .minute), (2, .hour), (3, .day), (4, .month))
    
    let date6 = Date.beforeNow(difference: [(1, .minute), (2, .hour), (3, .day), (4, .month)])
    
    let date7 = currentDate - (1, .day)
    
    currentDate -= Date.Component(value: 1, type: .day)
    

    More

    • Get components (hours, months, days...) from date
    • Compare days by components
    • Convert date to formated string date

提交回复
热议问题