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

前端 未结 13 746
一向
一向 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
    0 讨论(0)
  • 2020-12-04 13:44

    According to your needs, you may choose one of the 3 following Swift 5 methods to get one hour ago from a Date instance.


    1. date(byAdding:value:to:wrappingComponents:)

    Calendar has a method called date(byAdding:value:to:wrappingComponents:). date(byAdding:value:to:wrappingComponents:) has the following declaration:

    func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?
    

    Returns a new Date representing the date calculated by adding an amount of a specific component to a given date.

    The Playground code below shows how to use it:

    import Foundation
    
    let now = Date()
    let oneHourAgo = Calendar.current.date(byAdding: .hour, value: -1, to: now)
    
    print(now) // 2016-12-19 21:52:04 +0000
    print(String(describing: oneHourAgo)) // Optional(2016-12-19 20:52:04 +0000)
    

    2. date(byAdding:to:wrappingComponents:)

    Calendar has a method called date(byAdding:to:wrappingComponents:). date(byAdding:value:to:wrappingComponents:) has the following declaration:

    func date(byAdding components: DateComponents, to date: Date, wrappingComponents: Bool = default) -> Date?
    

    Returns a new Date representing the date calculated by adding components to a given date.

    The Playground code below shows how to use it:

    import Foundation
    
    let now = Date()
    
    var components = DateComponents()
    components.hour = -1
    let oneHourAgo = Calendar.current.date(byAdding: components, to: now)
    
    print(now) // 2016-12-19 21:52:04 +0000
    print(String(describing: oneHourAgo)) // Optional(2016-12-19 20:52:04 +0000)
    

    Alternative:

    import Foundation
    
    // Get the date that was 1hr before now
    let now = Date()
    
    let components = DateComponents(hour: -1)
    let oneHourAgo = Calendar.current.date(byAdding: components, to: now)
    
    print(now) // 2016-12-19 21:52:04 +0000
    print(String(describing: oneHourAgo)) // Optional(2016-12-19 20:52:04 +0000)
    

    3. addingTimeInterval(_:) (use with caution)

    Date has a method called addingTimeInterval(_:). addingTimeInterval(_:) has the following declaration:

    func addingTimeInterval(_ timeInterval: TimeInterval) -> Date
    

    Return a new Date by adding a TimeInterval to this Date.

    Note that this method comes with a warning:

    This only adjusts an absolute value. If you wish to add calendrical concepts like hours, days, months then you must use a Calendar. That will take into account complexities like daylight saving time, months with different numbers of days, and more.

    The Playground code below shows how to use it:

    import Foundation
    
    let now = Date()
    let oneHourAgo = now.addingTimeInterval(-3600)
    
    print(now) // 2016-12-19 21:52:04 +0000
    print(oneHourAgo) // 2016-12-19 20:52:04 +0000
    
    0 讨论(0)
  • 2020-12-04 13:45

    If you are using NSDate you can do:

    let date = NSDate()
    date.dateByAddingTimeInterval(-3600)
    

    It will change the date object to be "1 hour ago".

    0 讨论(0)
  • 2020-12-04 13:47
    let now = Date()
    let nowMinusTwoAndAHalfHours = now - 2.5*60*60
    
    print(now)
    print(nowMinusTwoAndAHalfHours)
    
    0 讨论(0)
  • 2020-12-04 13:48

    Use this method and paste in your helper class.

    Updated for Swift 3 and Xcode 8.3

    class func timeAgoSinceDate(_ date:Date,currentDate:Date, numericDates:Bool) -> String {
        let calendar = Calendar.current
        let now = currentDate
        let earliest = (now as NSDate).earlierDate(date)
        let latest = (earliest == now) ? date : now
        let components:DateComponents = (calendar as NSCalendar).components([NSCalendar.Unit.minute , NSCalendar.Unit.hour , NSCalendar.Unit.day , NSCalendar.Unit.weekOfYear , NSCalendar.Unit.month , NSCalendar.Unit.year , NSCalendar.Unit.second], from: earliest, to: latest, options: NSCalendar.Options())
        
        if (components.year! >= 2) {
            return "\(components.year!) years ago"
        } else if (components.year! >= 1){
            if (numericDates){
                return "1 year ago"
            } else {
                return "Last year"
            }
        } else if (components.month! >= 2) {
            return "\(components.month!) months ago"
        } else if (components.month! >= 1){
            if (numericDates){
                return "1 month ago"
            } else {
                return "Last month"
            }
        } else if (components.weekOfYear! >= 2) {
            return "\(components.weekOfYear!) weeks ago"
        } else if (components.weekOfYear! >= 1){
            if (numericDates){
                return "1 week ago"
            } else {
                return "Last week"
            }
        } else if (components.day! >= 2) {
            return "\(components.day!) days ago"
        } else if (components.day! >= 1){
            if (numericDates){
                return "1 day ago"
            } else {
                return "Yesterday"
            }
        } else if (components.hour! >= 2) {
            return "\(components.hour!) hours ago"
        } else if (components.hour! >= 1){
            if (numericDates){
                return "1 hour ago"
            } else {
                return "An hour ago"
            }
        } else if (components.minute! >= 2) {
            return "\(components.minute!) minutes ago"
        } else if (components.minute! >= 1){
            if (numericDates){
                return "1 minute ago"
            } else {
                return "A minute ago"
            }
        } else if (components.second! >= 3) {
            return "\(components.second!) seconds ago"
        } else {
            return "Just now"
        }
        
    }
    

    Use of this method:

    var timeAgo:String=AppHelper.timeAgoSinceDate(date, numericDates: true)
    Print("\(timeAgo)")   // Ex- 1 hour ago
    
    0 讨论(0)
  • 2020-12-04 13:49

    In swift 5 You can use

          let earlyDate = Calendar.current.date( byAdding: .hour, value: -1, to: Date())
          let df = DateFormatter()
          df.dateFormat = "yyyy-MM-dd HH:mm:ss"
          let dateString = df.string(from: earlyDate!)
    

    Out put will Be like bellow

    Current DateTime--> 2019-12-20 09:40:08
    One Hour Previous Date Time--> 2019-12-20 08:40:08
    
    0 讨论(0)
提交回复
热议问题