【问题标题】:SWIFT: How do I add hours to NSDate objectSWIFT:如何向 NSDate 对象添加小时数
【发布时间】:2017-09-08 15:23:31
【问题描述】:

我从字符串生成一个 NSDate 对象。

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")
let stringToDate = dateFormatter.dateFromString(dateFromService) // 2015-07-20 12:00:43 +0000

我从网络服务器获取这个字符串值。我需要修改个人设备时区。想给这个 stringToDate 对象加小时但不工作

var addHours : Int = 2 // 2 hours will be added
var newDate = stringToDate.dateByAddingTimeInterval(addHours)

【问题讨论】:

  • 看起来您增加了 2 秒而不是 2 小时。 timeInterval 始终以秒为单位。或者你可以使用 NSDate 的组件。添加Int = Hour *60*60
  • 你应该使用NSDateComponents来调整日期和时间。
  • 是的,他正在增加秒数。 NSTimeInterval 代表秒数。

标签: ios swift nsdate


【解决方案1】:

对于 Swift 3,你可以使用这个函数:

//get next date by adding hours func  

getNewDateAfterAddingHours(hoursToAdd:NSInteger, oldDate:Date) -> Int64 {
    let calendar = Calendar.current
    let newDate = calendar.date(byAdding: .hour, value: hoursToAdd, to: oldDate)
    return Int64((newDate?.timeIntervalSince1970)!)
}

【讨论】:

    【解决方案2】:

    你问错问题了。这就是所谓的"XY Problem"。 您应该问“如何在用户本地时区显示从 Web 服务器获取的日期字符串。”

    NSDate 表示不包含时区的抽象形式的日期/时间。您将其转换为特定时区以进行显示。不要尝试在 NSDate 中添加/减去小时数以抵消时区。那是错误的做法。

    正确答案很简单。创建第二个日期格式化程序,不要将其时区设置为 GMT。它默认为用户的本地时区。

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")
    let date = dateFormatter.dateFromString(dateFromService) 
    
    let outputDatedateFormatter = NSDateFormatter()
    outputDatedateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    //leave the time zone at the default (user's time zone)
    let displayString = outputDateFormatter.stringFromDate(date)
    println("Date in local time zone = \(displayString)")
    

    【讨论】:

    • 你的倒数第二行包含一些 Objective-C 语法:)
    • 而且少了一个分号。 :)
    • 确实如此。感谢您发现它,并感谢 nhgrif 修复它。
    【解决方案3】:

    如果您经常这样做,请查看名为 SwiftMoment 的库(灵感来自同一个 .js 库),它允许您执行以下操作(以及更多!):

    // Create date using moment library
    let myDate = moment(myString)
    
    // Add one hour
    let dateWithAddedHour = myDate + 1.hours
    

    Moment 是 NSDate 实例的包装,而 Duration(这是您从 Int.hours、Int.minutes 等获得的)包装一个 NSTimeInterval 值。

    实施此操作只需片刻! (双关语)。

    【讨论】:

      【解决方案4】:

      使用NSCalendarComponents:

      let calendar = NSCalendar.currentCalendar()
      let newDate = calendar.dateByAddingUnit(
          .CalendarUnitHour, // adding hours
          value: 2, // adding two hours
          toDate: oldDate,
          options: .allZeros
      )
      

      使用NSCalendar 将考虑闰秒、闰小时等。

      但正如Duncan C's answer 指出的那样,简单地增加小时数绝对是错误的方法。两个时区并不总是相隔相同的时间。同样,当我们将夏令时考虑在内时,这一点尤其正确。 (例如,美国不会与欧洲在同一天开始/结束夏令时,而亚利桑那州甚至不进行夏令时)。

      【讨论】:

      • 关于使用 NSCalendar 和朋友,您通常是正确的。但是:如果“闰小时”指的是 DST 转换,那么这只是 和更大单位的问题,而不是两个小时。并且闰秒通常被 Unix 时间忽略,如果你使用 NSDateComponents 或者添加一个 NSTimeInterval 没有任何区别。
      • 嗯,是的。但是使用NSCalendar 还有其他原因。它最终更具可读性......它让你养成了写它的习惯,这样当谈到它毫无疑问确实很重要的时候,你就不会弄错了。
      • 当然。我主要想指出“NSCalendar 等对于考虑闰秒是必要的”这一论点是错误的。
      猜你喜欢
      • 2016-10-31
      • 2010-12-11
      • 2010-11-06
      • 2011-01-20
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2019-05-26
      相关资源
      最近更新 更多