32

我想从日期中减去 4 小时。我使用以下代码将日期字符串读入 NSDate 对象:

NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
NSDate * mydate = [dateFormatter dateFromString:[dict objectForKey:@"published"]];

接下来我该怎么做?

4

7 回答 7

49
NSDate *newDate = [theDate dateByAddingTimeInterval:-3600*4];

链接到文档


NSDate *newDate = [[[NSDate alloc] initWithTimeInterval:-3600*4
                                              sinceDate:theDate]] autorelease];

链接到文档

于 2009-07-21T18:58:58.193 回答
23

NSCalendar 是用于根据人类时间单位更改日期的通用 API。为此,您可以使用-dateByAddingComponents:toDate:options:具有负数小时数的 NSCalendar。

于 2009-07-21T18:47:59.167 回答
8

在斯威夫特 4 中:

var baseDate = ... // something
let dateMinus4Hours = Calendar.current.date(byAdding: .hour, value: -4, to: baseDate)

不要24*3600和东西一起去,那是自找麻烦。

于 2018-05-15T14:57:44.673 回答
6

由于 iOS 8 有更方便dateByAddingUnit

斯威夫特 2.x

//subtract 3 hours
let calendar = NSCalendar.autoupdatingCurrentCalendar()
newDate = calendar.dateByAddingUnit(.Hour, value: -3, toDate: originalDate, options: [])
于 2015-05-10T13:37:08.783 回答
5
//in Swift 3
//subtract 3 hours
let calendar = NSCalendar.autoupdatingCurrent
newDate = calendar.date(byAdding:.hour, value: -3, to: originalDate)
于 2016-12-09T07:32:33.647 回答
2

这里的函数可能很有用,因为它返回日期 -4 h 考虑到这也可能会更改日期和月份,最终会更改年份。.searchBackward 选项是重要的部分:)

public static func correctSecondComponent(date: Date, calendar: Calendar = Calendar(identifier: Calendar.Identifier.gregorian))->Date {

    let hour = calendar.component(.hour, from: date)

    let e = (calendar as NSCalendar).date(byAdding: NSCalendar.Unit.hour, value: -4, to: date, options:.searchBackwards)!

    return e
}
于 2018-05-04T19:20:07.833 回答
1

dateFromString 函数返回 NSDate,而不是 NSString。你应该改变,

NSDate * theDate = [dateFormatter dateFromString:datetemp];

于 2009-08-05T23:13:48.067 回答