SWIFT:如何为NSDate对象添加小时数

时间:2015-07-20 12:08:55

标签: ios swift nsdate

我从string生成一个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)

4 个答案:

答案 0 :(得分:14)

使用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指出的那样,简单地增加小时绝对是错误的做法。两个时区不会总是以相同的时间间隔分开。同样,当我们考虑夏令时时,尤其如此。 (例如,美国在与欧洲同一天没有开始/结束夏令时,亚利桑那州甚至没有夏令时)。

答案 1 :(得分:8)

你问错了问题。这就是所谓的"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)")

答案 2 :(得分: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)!)
}

答案 3 :(得分:0)

如果您经常这样做,请查看名为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值。

实现这一点应该只需要一会儿! (双关语)。