【问题标题】:How to calculate how much time passed from the date with timezone?如何计算从带有时区的日期过去了多少时间?
【发布时间】:2016-06-03 06:50:47
【问题描述】:

我从服务器获得了一个具有这种格式的日期:

2016-05-27 17:33:43+0400

现在,我想检测自该日期以来经过了多少时间?例如1 day 5 hours 10 minutes 20 seconds

我该怎么做?我知道如何根据时间戳计算,但不知道如何将其转换为时间戳。

谁能帮帮我?

例如:

将此2016-05-27 17:33:43+0400 转换为1464370423

或者也许还有其他解决方案。我只想计算从那时起经过了多少时间

【问题讨论】:

  • “转换为时间戳”是什么意思?你能展示你想要什么输出以及到目前为止你有什么吗?
  • @Paulw11 我已经编辑了我的问题并添加了这个:例如,将这个2016-05-27 17:33:43+0400 转换为1464370423 这个或者也许还有另一种解决方案。我只想计算从那时起经过了多少时间(多少天,多少小时,多少分钟,多少秒)
  • 看看 NSDateFormatter,它允许您将 NSDate 转换为字符串格式/从字符串格式转换。拥有 NSDate 后,您似乎正在寻找 developer.apple.com/library/ios/documentation/Cocoa/Reference/…
  • 什么是1464370423
  • @Paulw11 时间戳

标签: ios swift swift2 nsdate


【解决方案1】:

您可以使用 NSDateComponents 格式化程序来获取两个日期之间的相对时间。关于日期字符串格式,您需要使用xx 作为时区部分。

let dateStr = "2016-05-27 17:33:43+0400"

let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ssxx"
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
if let date = formatter.dateFromString(dateStr) {
    print(date)   // "2016-05-27 13:33:00 +0000\n" -4hs
    let dateComponentsFormatter = NSDateComponentsFormatter()
    dateComponentsFormatter.allowedUnits = [.Day,.Hour,.Minute,.Second]
    dateComponentsFormatter.unitsStyle = .Full
    print(dateComponentsFormatter.stringFromDate(date, toDate: NSDate()) ?? "") // 6 days, 17 hours, 51 minutes, 29 seconds
}

【讨论】:

  • 似乎 NSDateFormatter 非常宽容。它适用于 ZZZ ZZZZ ZZZZZ 或 xx
【解决方案2】:

给定输入字符串,您可以使用以下方法将其转换为日期,然后转换为自当前时间以来的NSTimeInterval

let inputDate = "2016-05-27 17:33:43+0400"

let dateFormatter = NSDateFormatter()

dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZZZZZ"

if let aDate = dateFormatter.dateFromString(inputDate) {

    let timeInterval = aDate.timeIntervalSinceNow

    let dateComponentsFormatter = NSDateComponentsFormatter()

    if let dateString = dateComponentsFormatter.stringFromTimeInterval(abs(timeInterval)) {

        print ("Elapsed time=\(dateString)")
    }
}

输出:

经过的时间=6d 17:51:52

您可以使用aDate.timeIntervalSince1970 将日期作为您问题中的时间戳

【讨论】:

    【解决方案3】:

    我建议这可以帮助你:How to get the current time as datetime

    您可以获取当前时间并使用服务器时间和您的当前时间计算差异。

    let date = NSDate()
    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date)
    let hour = components.hour
    let minutes = components.minute
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      这会告诉你

      “多少次”

      自事件发生后过去。

      let date = Date()
      let howManyTimePassed = date.timeIntervalSinceNow
      

      TimeIntervaltypealiasdouble,意思是 double 的另一种说法。 timeInterval 的值代表秒。

      【讨论】:

        【解决方案5】:

        Swift 5.1 中试试这个类:

        open class MyDateClass: NSObject {
        
            private var result:MyDateTime!
            
             init(dateStr: String, inputFormat: String) {
                let formatter = DateFormatter()
                formatter.dateFormat = inputFormat //"yyyy-MM-dd HH:mm:ss"
                formatter.calendar = Calendar(identifier: .gregorian)
                formatter.locale = Locale(identifier: "en_US_POSIX")
                if let date = formatter.date(from: dateStr) {
                    let dateComponentsFormatter = DateComponentsFormatter()
                    dateComponentsFormatter.allowedUnits = [.year,.month,.day,.hour,.minute,.second]
                    dateComponentsFormatter.unitsStyle = .full
                    let strFromat = dateComponentsFormatter.string(from: date, to: Date()) ?? ""
                    var trimmedString = strFromat.replacingOccurrences(of: " ", with: "")
                    trimmedString = trimmedString.replacingOccurrences(of: "years", with: "")
                    trimmedString = trimmedString.replacingOccurrences(of: "months", with: "")
                    trimmedString = trimmedString.replacingOccurrences(of: "days", with: "")
                    trimmedString = trimmedString.replacingOccurrences(of: "hours", with: "")
                    trimmedString = trimmedString.replacingOccurrences(of: "minutes", with: "")
                    trimmedString = trimmedString.replacingOccurrences(of: "seconds", with: "")
                    let arr = trimmedString.split(separator: ",")
                    let result = MyDateTime(year: Int(arr[0]), month: Int(arr[1]), day: Int(arr[2]), hour: Int(arr[3]), minute: Int(arr[4]), second: Int(arr[5]))
                    self.result = result
                }
            }
            
            func getDateTime() -> MyDateTime {
                return result
            }
              
        }
        
        public struct MyDateTime {
            var year:Int?
            var month:Int?
            var day:Int?
            var hour:Int?
            var minute:Int?
            var second:Int?
        }
        

        这个类的工作方式是这样的:

        let myClass = MyDateClass(dateStr: "2016-05-27 17:33:43", inputFormat: "yyyy-MM-dd HH:mm:ss")
        let time = myClass.getDateTime()
        

        现在您可以随心所欲地显示时间了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-19
          相关资源
          最近更新 更多