如何为 NSDate 添加 1 天?

Posted

技术标签:

【中文标题】如何为 NSDate 添加 1 天?【英文标题】:How do I add 1 day to an NSDate? 【发布时间】:2011-07-01 08:48:31 【问题描述】:

基本上,正如标题所说。我想知道如何将 1 天添加到 NSDate

如果是这样的话:

21st February 2011

它会变成:

22nd February 2011

如果是的话:

31st December 2011

它会变成:

1st January 2012.

【问题讨论】:

请注意,NSDate 不代表日期,它代表时间点。所以它包括时间和日期。 同意 - 您应该在下面使用 Zack German 的回答。请参阅 Apple 的 Date and Time Programming Guide。 【参考方案1】:

为 Swift 5 更新

let today = Date()
let nextDate = Calendar.current.date(byAdding: .day, value: 1, to: today)

目标 C

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
 // now build a NSDate object for the next day
 NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
 [offsetComponents setDay:1];
 NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate: [NSDate date] options:0];

【讨论】:

【参考方案2】:

您可以使用 NSDate 的方法 - (id)dateByAddingTimeInterval:(NSTimeInterval)seconds 其中 seconds 将是 60 * 60 * 24 = 86400

【讨论】:

NSDate 的 addByTimeInterval 在 ios 4 (bit.ly/vtOzvU) 中已被弃用。请改用 dateByAddingTimeInterval (bit.ly/vRkFrN)。 天可以有 23、24 或 25 小时,因为夏令时。【参考方案3】:

Swift 5.0:

var dayComponent    = DateComponents()
dayComponent.day    = 1 // For removing one day (yesterday): -1
let theCalendar     = Calendar.current
let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
print("nextDate : \(nextDate)")

目标 C:

NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
NSDate *nextDate = [theCalendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0];

NSLog(@"nextDate: %@ ...", nextDate);

这应该是不言自明的。

【讨论】:

您也可以使用负分量从日期中减去。 比所选答案更好的解决方案 +1 用于使用日期组件,而不是添加一天的秒数。 是的,适用于夏令时。夏令时检查提示:在你的 mac 上重置日期和时间,然后重新启动你的模拟器,它将遵循你的系统时间。 在 Swift 中,您需要将 dateByAddingComponents 调用的最后一个参数更改为 NSCalendarOptions(rawValue: 0)【参考方案4】:

使用以下代码:

NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

作为

addTimeInterval

现已弃用。

【讨论】:

天可以有 23、24 或 25 小时,因为夏令时【参考方案5】:

使用以下函数并使用 days 参数获取日期 daysAhead/daysBehind 只需将参数作为未来日期的正数或以前日期的负数传递:

+ (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days

    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    dateComponents.day = days;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *previousDate = [calendar dateByAddingComponents:dateComponents
                                                     toDate:fromDate
                                                    options:0];
    [dateComponents release];
    return previousDate;

【讨论】:

【参考方案6】:
NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
dateToBeIncremented = [theCalendar dateByAddingComponents:dayComponent toDate:dateToBeIncremented options:0];

好的 - 我认为这对我有用。但是,如果您使用它为 2013 年 3 月 31 日添加一天,它将返回一个仅添加 23 小时的日期。它实际上可能有 24 小时,但使用 in 计算只增加了 23:00 小时。

同样,如果您提前到 2013 年 10 月 28 日,代码会增加 25 小时,从而导致日期时间为 2013-10-28 01:00:00。

为了在顶部添加一天我正在做的事情,添加:

NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

复杂,主要是由于夏令时。

【讨论】:

一年一次,一天只有 23 小时。一次 25。由于闰秒,每隔几年它的长度为 60*60*24 + 1。日期必须涵盖所有这些,这就是为什么可可的日期处理实际上很棒!【参考方案7】:
NSDate *today=[NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components=[[NSDateComponents alloc] init];
components.day=1;
NSDate *targetDate =[calendar dateByAddingComponents:components toDate:today options: 0];

【讨论】:

【参考方案8】:
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
NSDate *startDate = [calendar dateFromComponents:components];
NSLog(@"StartDate = %@", startDate);

components.day += 1;
NSDate *endDate = [calendar dateFromComponents:components];
NSLog(@"EndDate = %@", endDate);

【讨论】:

【参考方案9】:

从 iOS 8 开始你可以使用NSCalendar.dateByAddingUnit

Swift 1.x 中的示例:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
         .CalendarUnitDay, 
         value: 1, 
         toDate: today, 
         options: NSCalendarOptions(0)
    )

斯威夫特 2.0:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
        .Day, 
        value: 1, 
        toDate: today, 
        options: []
    )

斯威夫特 3.0:

let today = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)

【讨论】:

只有我一个人,或者 Swift 内置类似 date.add(.days, 1) 的东西会不会更简单? *去构建一个扩展 @quemeful extension Date func adding(_ component: Calendar.Component, _ value: Int) -> Date? return Calendar.current.date(byAdding: component, value: value, to: self) 用法 Date().adding(.day, 1) // "Jun 6, 2019 at 5:35 PM"【参考方案10】:

iOS 8+、OSX 10.9+、Objective-C

NSCalendar *cal = [NSCalendar currentCalendar];    
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay 
                                   value:1 
                                  toDate:[NSDate date] 
                                 options:0];

【讨论】:

请注意,这里不能屏蔽单位(只能使用一个)。【参考方案11】:

迅速

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

var theCalendar = NSCalendar.currentCalendar()
var nextDate = theCalendar.dateByAddingComponents(dayComponenet, toDate: NSDate(), options: nil)

【讨论】:

【参考方案12】:

我遇到了同样的问题;使用 NSDate 的扩展:

- (id)dateByAddingYears:(NSUInteger)years
                 months:(NSUInteger)months
                   days:(NSUInteger)days
                  hours:(NSUInteger)hours
                minutes:(NSUInteger)minutes
                seconds:(NSUInteger)seconds

    NSDateComponents * delta = [[[NSDateComponents alloc] init] autorelease];
    NSCalendar * gregorian = [[[NSCalendar alloc]
                               initWithCalendarIdentifier:NSCalendarIdentifierGregorian] autorelease];

    [delta setYear:years];
    [delta setMonth:months];
    [delta setDay:days];
    [delta setHour:hours];
    [delta setMinute:minutes];
    [delta setSecond:seconds];

    return [gregorian dateByAddingComponents:delta toDate:self options:0];

【讨论】:

【参考方案13】:
NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *tomorrowDate = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE, dd MMM yyyy"];
NSLog(@"%@", [dateFormatter stringFromDate:tomorrowDate]);

【讨论】:

谁曾经使用过这段代码并遇到麻烦:当之无愧【参考方案14】:

您可以在 swift 中进行扩展以在 NSDate 中添加方法

extension NSDate 
    func addNoOfDays(noOfDays:Int) -> NSDate! 
        let cal:NSCalendar = NSCalendar.currentCalendar()
        cal.timeZone = NSTimeZone(abbreviation: "UTC")!
        let comps:NSDateComponents = NSDateComponents()
        comps.day = noOfDays
        return cal.dateByAddingComponents(comps, toDate: self, options: nil)
    

你可以用这个

NSDate().addNoOfDays(3)

【讨论】:

【参考方案15】:

在 Swift 2.1.1 和 xcode 7.1 OSX 10.10.5 中,您可以使用函数向前和向后添加任意天数

func addDaystoGivenDate(baseDate:NSDate,NumberOfDaysToAdd:Int)->NSDate

    let dateComponents = NSDateComponents()
    let CurrentCalendar = NSCalendar.currentCalendar()
    let CalendarOption = NSCalendarOptions()

    dateComponents.day = NumberOfDaysToAdd

    let newDate = CurrentCalendar.dateByAddingComponents(dateComponents, toDate: baseDate, options: CalendarOption)
    return newDate!

将当前日期增加 9 天的函数调用

var newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: 9)
print(newDate)

函数调用将当前日期减 80 天

newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: -80)
 print(newDate)

【讨论】:

【参考方案16】:

有效!

NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitDay;
NSInteger value = 1;
NSDate *today = [NSDate date];
NSDate *tomorrow = [calendar dateByAddingUnit:unit value:value toDate:today options:NSCalendarMatchStrictly];

【讨论】:

我的答案更正确,因为如果您使用 NSCalendarWrapComponents(0) 选项,您只能在当前月份的范围内创建日期。这意味着如果您使用 NSCalendarWrapComponents 将 1 天添加到 2016 年 1 月 31 日,您将获得 2016 年 1 月 1 日。使用 NSCalendarMatchStrictly 选项,您将获得下一个日历日期。【参考方案17】:

这是一种通用方法,可让您在指定日期添加/减去任何类型的单位(年/月/日/小时/秒等)。

使用 Swift 2.2

func addUnitToDate(unitType: NSCalendarUnit, number: Int, date:NSDate) -> NSDate 

    return NSCalendar.currentCalendar().dateByAddingUnit(
        unitType,
        value: number,
        toDate: date,
        options: NSCalendarOptions(rawValue: 0))!



print( addUnitToDate(.Day, number: 1, date: NSDate()) ) // Adds 1 Day To Current Date
print( addUnitToDate(.Hour, number: 1, date: NSDate()) ) // Adds 1 Hour To Current Date
print( addUnitToDate(.Minute, number: 1, date: NSDate()) ) // Adds 1 Minute To Current Date

// NOTE: You can use negative values to get backward values too

【讨论】:

【参考方案18】:

对于 Swift 2.2:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar().dateByAddingUnit(
        .Day,
        value: 1,
        toDate: today,
        options: NSCalendarOptions.MatchStrictly)

希望这对某人有所帮助!

【讨论】:

【参考方案19】:

一个基于highmaintenance's 答案和vikingosegundo's 评论的工作Swift 3+ 实现。此日期扩展还具有更改年、月和时间的其他选项:

extension Date 

    /// Returns a Date with the specified amount of components added to the one it is called with
    func add(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? 
        let components = DateComponents(year: years, month: months, day: days, hour: hours, minute: minutes, second: seconds)
        return Calendar.current.date(byAdding: components, to: self)
    

    /// Returns a Date with the specified amount of components subtracted from the one it is called with
    func subtract(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? 
        return add(years: -years, months: -months, days: -days, hours: -hours, minutes: -minutes, seconds: -seconds)
    


按照 OP 的要求仅添加一天的用法是:

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)

【讨论】:

您可以通过使用日期组件来大幅缩短代码。 你是对的,虽然我认为它有缺点: - 使用扩展的代码看起来不那么干净 - 它打开了一些不必要的选项,其中的组件毫无意义,例如 let foo = Date().add([.calendar: 1, .yearForWeekOfYear: 3]不过,我正在为我的答案添加替代解决方案。感谢您的建议,@vikingosegundo! 好吧,其实我的意思是不同的:gist.github.com/vikingosegundo/31ddb14920415ef444a9ab550411d4ff【参考方案20】:

斯威夫特 2.0

let today = NSDate()    
let calendar = NSCalendar.currentCalendar()
let tomorrow = calendar.dateByAddingUnit(.Day, value: 1, toDate: today, options: NSCalendarOptions.MatchFirst)

【讨论】:

【参考方案21】:

Swift 3.0 非常简单的实现是:

func dateByAddingDays(inDays: Int) -> Date 
    let today = Date()
    return Calendar.current.date(byAdding: .day, value: inDays, to: today)!

【讨论】:

【参考方案22】:

Swift 4,如果您真正需要的是 24 小时轮班(60*60*24 秒)而不是“1 个日历日”

未来: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

过去: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))

【讨论】:

【参考方案23】:

Swift 4.0(与 this wonderful answer 中的 Swift 3.0 相同,只是让像我这样的新手清楚)

let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)

【讨论】:

您忘记更改变量名了吗?【参考方案24】:

Swift 4.0

extension Date 
    func add(_ unit: Calendar.Component, value: Int) -> Date? 
        return Calendar.current.date(byAdding: unit, value: value, to: self)
    

用法

date.add(.day, 3)!   // adds 3 days
date.add(.day, -14)!   // subtracts 14 days

注意:如果您不知道为什么代码行以感叹号结尾,请在 Google 上查找“Swift Optionals”。

【讨论】:

【参考方案25】:

Swift 4 更新:

let now = Date() // the current date/time
let oneDayFromNow = Calendar.current.date(byAdding: .day, value: 1, to: now) // Tomorrow with same time of day as now

【讨论】:

【参考方案26】:

在 swift 4 或 swift 5 中,你可以像下面这样使用:

    let date = Date()
    let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: date)
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let yesterday_date = dateFormatter.string(from: yesterday!)
    print("yesterday->",yesterday_date)

输出:

Current date: 2020-03-02
yesterday date: 2020-03-01

【讨论】:

【参考方案27】:

字符串扩展:转换 String_Date > Date

extension String
  func DateConvert(oldFormat:String)->Date // format example: yyyy-MM-dd HH:mm:ss 
    let isoDate = self
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = oldFormat
    return dateFormatter.date(from:isoDate)!
  

日期扩展:转换日期>字符串

extension Date
 func DateConvert(_ newFormat:String)-> String
    let formatter = DateFormatter()
    formatter.dateFormat = newFormat
    return formatter.string(from: self)
 

日期扩展:获取 +/- 日期

extension String
  func next(day:Int)->Date
    var dayComponent    = DateComponents()
    dayComponent.day    = day
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
  

 func past(day:Int)->Date
    var pastCount = day
    if(pastCount>0)
        pastCount = day * -1
    
    var dayComponent    = DateComponents()
    dayComponent.day    = pastCount
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
 

用法:

let today = Date()
let todayString = "2020-02-02 23:00:00"
let newDate = today.DateConvert("yyyy-MM-dd HH:mm:ss") //2020-02-02 23:00:00
let newToday = todayString.DateConvert(oldFormat: "yyyy-MM-dd HH:mm:ss")//2020-02-02
let newDatePlus = today.next(day: 1)//2020-02-03 23:00:00
let newDateMinus = today.past(day: 1)//2020-02-01 23:00:00

参考:来自多个问题 How do I add 1 day to an NSDate? math function to convert positive int to negative and negative to positive? Converting NSString to NSDate (and back again)

【讨论】:

【参考方案28】:

swift 5 的更新

let nextDate = fromDate.addingTimeInterval(60*60*24)

【讨论】:

永远不要使用 TimeInterval 调整日期,除非您特别想要几秒钟。如果您正在处理夏令时、闰秒等的更改,这将不起作用。【参考方案29】:

只是为了好玩,加上一些扩展和运算符重载,你可以得到一些不错的东西,比如:

let today = Date()
let tomorrow = today + 1.days

,或

var date = Date()
date += 1.months

以下是支持代码:

extension Calendar 
    struct ComponentWithValue 
        let component: Component
        let value: Int
    


extension Int 
    var days: Calendar.ComponentWithValue 
        .init(component: .day, value: self)
    
    
    var months: Calendar.ComponentWithValue 
        .init(component: .month, value: self)
    


func +(_ date: Date, _ amount: Calendar.ComponentWithValue) -> Date 
    Calendar.current.date(byAdding: amount.component, value: amount.value, to: date)!


func +(_ amount: Calendar.ComponentWithValue, _ date: Date) -> Date 
    date + amount


func +=(_ date: inout Date, _ amount: Calendar.ComponentWithValue) 
    date = date + amount

代码极少,可轻松扩展为.months.years.hours等。还可以无缝添加对减法(-)的支持。

不过,在 + 运算符的实现中存在强制展开,但不确定在哪些情况下日历可以返回 nil 日期。

【讨论】:

【参考方案30】:

从任何日期开始的昨天和明天的简单扩展:

extension Date 
    
    var previousDay: Date 
        Calendar.current.date(byAdding: DateComponents(day:-1), to: self)!
    
    
    var nextDay: Date 
        Calendar.current.date(byAdding: DateComponents(day:+1), to: self)!
    
    

我将根据此处问题中的建议强制解包选项:When does dateByAddingComponents:toDate:options return nil?

【讨论】:

以上是关于如何为 NSDate 添加 1 天?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone OS:如何为特定日期创建 NSDate?

如何在给定的 NSDate 前两天触发 UILocalNotification?

如何为 Chrono UTC 添加天数?

如何为按钮右侧添加图像/图标?

如何为drupal添加状态代码410以删除内容以改善SEO?

如何为 C++ 程序添加定时延迟?