【问题标题】:Subtract 7 days from current date从当前日期减去 7 天
【发布时间】:2012-04-29 20:48:06
【问题描述】:

我似乎无法从当前日期减去 7 天。我就是这样做的:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:-7];
NSDate *sevenDaysAgo = [gregorian dateByAddingComponents:offsetComponents toDate:[NSDate date] options:0];

SevenDaysAgo 获得与当前日期相同的值。

请帮忙。

编辑:在我的代码中,我忘记用正确的日期替换获取当前日期的变量。所以上面的代码是正常的。

【问题讨论】:

  • [NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)] -- 虽然它不处理 DST 更改。
  • 应该可以。如果你加 1 而不是减 7,它会起作用吗?您如何确定 SevenDaysAgo 指的是今天?

标签: objective-c ios nsdate


【解决方案1】:

斯威夫特 5

从当前日期增加或减少日期的功能。

func addOrSubtructDay(day:Int)->Date{
  return Calendar.current.date(byAdding: .day, value: day, to: Date())!
}

现在调用函数

var dayAddedDate = addOrSubtructDay(7)
var daySubtractedDate = addOrSubtructDay(-7)
  • 添加日期传递预期日期值
  • 减负日通行证 价值

【讨论】:

  • @EricAya 感谢您的建议。
【解决方案2】:

Swift 运算符扩展:

extension Date {
    
    static func -(lhs: Date, rhs: Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: -rhs, to: lhs)!
    }
}

用法

let today = Date()
let sevenDayAgo = today - 7

【讨论】:

    【解决方案3】:

    Swift 4.2 - 自我变异(更新)

    如果原始发帖人已经有一个日期变量(更新/变异本身),这是一周前原始发帖人可以得到的另一种方式。

    extension Date {
        mutating func changeDays(by days: Int) {
            self = Calendar.current.date(byAdding: .day, value: days, to: self)!
        }
    }
    

    用法

    var myDate = Date()       // Jan 08, 2019
    myDate.changeDays(by: 7)  // Jan 15, 2019
    myDate.changeDays(by: 7)  // Jan 22, 2019
    myDate.changeDays(by: -1) // Jan 21, 2019
    

    // Iterate through one week
    for i in 1...7 {
        myDate.changeDays(by: i)
        // Do something
    }
    

    【讨论】:

      【解决方案4】:

      Swift 4.2 iOS 11.x Babec's 解决方案,纯Swift

      extension Date {
        static func changeDaysBy(days : Int) -> Date {
          let currentDate = Date()
          var dateComponents = DateComponents()
          dateComponents.day = days
          return Calendar.current.date(byAdding: dateComponents, to: currentDate)!
        }
      }
      

      【讨论】:

        【解决方案5】:

        原始接受答案的 Swift 3.0+ 版本

        Date().addingTimeInterval(-7 * 24 * 60 * 60)

        但是,这仅使用绝对值。在大多数情况下,使用日历答案可能更合适。

        【讨论】:

          【解决方案6】:

          如果您至少运行 iOS 8 或 OS X 10.9,还有一种更简洁的方法:

          NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
                                                                          value:-7
                                                                         toDate:[NSDate date]
                                                                        options:0];
          

          或者,使用 Swift 2:

          let sevenDaysAgo = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -7,
              toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))
          

          使用 Swift 3 及更高版本,它变得更加紧凑:

          let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())
          

          【讨论】:

          • 这应该是公认的答案,因为它会为您处理所有边缘情况。
          • @ZhivkoBogdanov 我的答案是在接受答案几年后出现的,我不相信您可以在事后更改接受的答案。
          • 它比其他任何东西都更适合将来参考。
          【解决方案7】:

          斯威夫特 3:

          对 Dov 答案的修改。

          extension Date {
          
              func dateBeforeOrAfterFromToday(numberOfDays :Int?) -> Date {
          
                  let resultDate = Calendar.current.date(byAdding: .day, value: numberOfDays!, to: Date())!
                  return resultDate
              }
          }
          

          用法:

          let dateBefore =  Date().dateBeforeOrAfterFromToday(numberOfDays : -7)
          let dateAfter = Date().dateBeforeOrAfterFromToday(numberOfDays : 7)
          print ("dateBefore : \(dateBefore), dateAfter :\(dateAfter)")
          

          【讨论】:

          • 为什么numberOfDays 是可选的,然后强制解包?它不应该只是一个非可选的Int吗?
          • 这是在 swift 函数中包含可选值的正确方法。
          • 但是为什么 numberOfDays 是可选的?是否有任何时候有人会调用此扩展方法而不给出添加或删除的天数?
          【解决方案8】:

          适用于 SWIFT 3.0

          这里是函数,你可以任意减少天数、月数、天数 例如这里,我将当前系统日期的年份减少了 100 年,你也可以对天、月进行 只需设置计数器 并将它存储在一个数组中,然后你可以在任何地方使用这个数组 函数当前时间()

           {
          
              let date = Date()
              let calendar = Calendar.current
              var year = calendar.component(.year, from: date)
              let month = calendar.component(.month, from: date)
              let  day = calendar.component(.day, from: date)
              let pastyear = year - 100
              var someInts = [Int]()
              printLog(msg: "\(day):\(month):\(year)" )
          
              for _ in pastyear...year        {
                  year -= 1
                               print("\(year) ")
                  someInts.append(year)
              }
                    print(someInts)
                  }
          

          【讨论】:

            【解决方案9】:

            斯威夫特 3

            Calendar.current.date(byAdding: .day, value: -7, to: Date())
            

            【讨论】:

            • 不要使用 NSCalendar,而是使用 Calendar :)
            【解决方案10】:

            dymv 的回答效果很好。这个你可以在swift中使用

            extension NSDate {    
                static func changeDaysBy(days : Int) -> NSDate {
                    let currentDate = NSDate()
                    let dateComponents = NSDateComponents()
                    dateComponents.day = days
                    return NSCalendar.currentCalendar().dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))!
                }
            }
            

            你可以调用它

            NSDate.changeDaysBy(-7) // Date week earlier
            NSDate.changeDaysBy(14) // Date in next two weeks
            

            希望对 dymv 有所帮助并感谢

            【讨论】:

              【解决方案11】:

              代码:

              NSDate *currentDate = [NSDate date];
              NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
              [dateComponents setDay:-7];
              NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:currentDate options:0];
              NSLog(@"\ncurrentDate: %@\nseven days ago: %@", currentDate, sevenDaysAgo);
              [dateComponents release];
              

              输出:

              currentDate: 2012-04-22 12:53:45 +0000
              seven days ago: 2012-04-15 12:53:45 +0000
              

              我完全同意 JeremyP 的观点。

              BR.
              尤金

              【讨论】:

              • 这个答案中存在内存泄漏。
              【解决方案12】:

              使用 dateByAddingTimeInterval 方法:

              NSDate *now = [NSDate date];
              NSDate *sevenDaysAgo = [now dateByAddingTimeInterval:-7*24*60*60];
              NSLog(@"7 days ago: %@", sevenDaysAgo);
              

              输出:

              7 days ago: 2012-04-11 11:35:38 +0000
              

              希望对你有帮助

              【讨论】:

              • 在某些极端情况下,这将无法正常工作,例如,如果夏令时在相关 7 天内发生变化。
              • dymv 的答案是更安全的方法。
              • 由于上述原因,这是错误的答案,使用 dymv 的答案
              • 其实这可以通过:[now dateByAddingDays:-7]
              • 做这种计算很危险,更喜欢@Dov的版本。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-28
              • 1970-01-01
              • 2013-01-03
              • 2015-06-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多