Ios NSCalendar.components().minute返回不一致的值

Ios NSCalendar.components().minute返回不一致的值,ios,objective-c,swift,cocoa-touch,Ios,Objective C,Swift,Cocoa Touch,最初的问题是在我的文章,测试和代码在下面的链接中遇到的 这是最小的测试用例 我正在创建一个与特定日期(在本例中为self)偏移的日期 在NSDate()扩展名中使用 NSCalendar.dateByAddingUnit(…,值:x,…) 然后,我使用NSCalendar.components(…,fromDate,toDate, ..)分钟 如果x>0,我在上面的步骤中得到的答案是x-1。如果x在代码中的4个不同位置调用NSDate() 每一个都将返回代码执行时的当前日期和时间,因此它们将相

最初的问题是在我的文章,测试和代码在下面的链接中遇到的

这是最小的测试用例

  • 我正在创建一个与特定日期(在本例中为self)偏移的日期 在NSDate()扩展名中使用 NSCalendar.dateByAddingUnit(…,值:x,…)
  • 然后,我使用NSCalendar.components(…,fromDate,toDate, ..)分钟

  • 如果x>0,我在上面的步骤中得到的答案是x-1。如果x在代码中的4个不同位置调用
    NSDate()

    每一个都将返回代码执行时的当前日期和时间,因此它们将相差几分之一秒


    我怀疑您希望在整个计算中使用一个一致的“今天”值。调用
    NSDate()。输入数据是什么,你得到了什么输出,你期望得到什么?如果你在回答中没有告诉我们你的确切测试用例(由于“保密原因”),我们如何建议更好的方法?或者我忽略了什么?即使阅读链接帖子(这里绝对应该包括相关部分),我也不太清楚问题出在哪里。请把你的问题解释清楚;示例输入和输出在这里可能会有所帮助。我编辑了原始帖子以创建最小的测试用例。我不知道为什么我被否决说没有研究工作。我在我的帖子中有大量的代码,测试等等,我提到的线程和这里的一样,就是这样。非常感谢,它防止了将来的bug,并简化了我的代码。我感到不舒服的是,我不得不旋转输入使其工作,伟大的是,它现在被整理出来。我将在这里发布接受的代码。
    
    //
    //  NSDateTest.swift
    //  NSDateTestCase
    //
    //  Created by Jitendra Kulkarni on 6/13/15.
    //
    
    import Foundation
    public extension NSDate {
    
            func xMins(x:Int) -> NSDate {
    
            return NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitMinute, value: x, toDate: self, options: nil)!
        }
    
         var hoursFromToday: Int{
    
            var fromDate: NSDate = self
            var toDate: NSDate = NSDate()
            var sign: Int = -1
            (fromDate,toDate, sign) = self.sanitizedDates()
    
            return (sign * NSCalendar.currentCalendar().components(.CalendarUnitHour, fromDate: fromDate, toDate: toDate, options: nil).hour)
        }
    
    
         var minsFromToday: Int{
    
    
            var fromDate: NSDate = self
            var toDate: NSDate = NSDate()
            var sign: Int = 1
            (fromDate,toDate) = self.sanitizedDates()
    
    
            return ( sign * NSCalendar.currentCalendar().components(.CalendarUnitMinute, fromDate: fromDate, toDate: toDate, options: nil).minute)
        }
    
    
        //Date Comparisons
        //https://stackoverflow.com/questions/26198526/nsdate-comparison-using-swift
    
    
        func isGreaterThanDate(dateToCompare : NSDate) -> Bool
        {
            //Declare Variables
            var isGreater = false
    
            //Compare Values
            if self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
            {
                isGreater = true
            }
    
            //Return Result
            return isGreater
        }
    
    
        // Date printing conversions
    
    
    
           var timeDayMonthYear: String {
            let dateMonthYearFormatter: NSDateFormatter = NSDateFormatter()
            let currentLocale: NSLocale = NSLocale.currentLocale()
            let dateMonthYearFormatString: NSString! = NSDateFormatter.dateFormatFromTemplate("EdMMMyyyy' ' HH':'mm",options: 0, locale: currentLocale)
            dateMonthYearFormatter.dateFormat = dateMonthYearFormatString as! String
            return dateMonthYearFormatter.stringFromDate(self)
        }
    
    
    
        private  func sanitizedDates() -> (fromDate: NSDate, toDate: NSDate) {
            var toDate: NSDate = self
            var fromDate: NSDate = NSDate()
            if(toDate.isGreaterThanDate(fromDate)) {
             //   toDate = toDate.xMins(1)  // Uncomment this to make the answer work
            }
    
                 return (fromDate,toDate)
    
        }
    
        static func test (mins: Int = 0) {
    
            NSLog("****************** Start Testing of NSDate **************************")
            NSLog("Inputs: mins: \(mins)")
            var today = NSDate()
            NSLog("Today is: \(today.timeDayMonthYear)")
    
                  var minsFromToday = today.xMins(mins)
            NSLog("** Date created \(mins) minutes from today is: \(minsFromToday.timeDayMonthYear)")
            NSLog("minsFromToday returns: \(minsFromToday.minsFromToday)");
    
            NSLog("hoursFromToday returns: \(minsFromToday.hoursFromToday)");
    
    
            NSLog("__________________ End Testing of NSDate    _________________________")
    
        }
    }
    
    2015-06-13 14:56:44.877 NSDateTestCase[23136:1150501] ****************** Start Testing of NSDate **************************
    2015-06-13 14:56:44.878 NSDateTestCase[23136:1150501] Inputs: mins: 60
    2015-06-13 14:56:44.882 NSDateTestCase[23136:1150501] Today is: Sat, Jun 13, 2015, 14:56
    2015-06-13 14:56:44.883 NSDateTestCase[23136:1150501] ** Date created 60 minutes from today is: Sat, Jun 13, 2015, 15:56
    2015-06-13 14:56:44.883 NSDateTestCase[23136:1150501] minsFromToday returns: 59  // *ERROR should be 60
    2015-06-13 14:56:44.884 NSDateTestCase[23136:1150501] hoursFromToday returns: 0 // *ERROR should be 1
    2015-06-13 14:56:44.884 NSDateTestCase[23136:1150501] __________________ End Testing of NSDate    _________________________
    2015-06-13 14:56:44.884 NSDateTestCase[23136:1150501] ****************** Start Testing of NSDate **************************
    2015-06-13 14:56:44.884 NSDateTestCase[23136:1150501] Inputs: mins: -60
    2015-06-13 14:56:44.885 NSDateTestCase[23136:1150501] Today is: Sat, Jun 13, 2015, 14:56
    2015-06-13 14:56:44.885 NSDateTestCase[23136:1150501] ** Date created -60 minutes from today is: Sat, Jun 13, 2015, 13:56
    2015-06-13 14:56:44.886 NSDateTestCase[23136:1150501] minsFromToday returns: -60
    2015-06-13 14:56:44.886 NSDateTestCase[23136:1150501] hoursFromToday returns: -1
    2015-06-13 14:56:44.893 NSDateTestCase[23136:1150501] __________________ End Testing of NSDate    _________________________
    
    //
    //  NSDateTest.swift
    //  NSDateTestCase
    //
    //  Created by Jitendra Kulkarni on 6/13/15.
    
    //
    
    import Foundation
    public extension NSDate {
    
            func xMins(x:Int) -> NSDate {
    
            return NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitMinute, value: x, toDate: self, options: nil)!
        }
    
    
    
        func hoursFromToday(today: NSDate) -> Int {
            var fromDate: NSDate = self
            var toDate: NSDate = today
    
            return (-NSCalendar.currentCalendar().components(.CalendarUnitHour, fromDate: fromDate, toDate: toDate, options: nil).hour)
    
        }
    
        func minsFromToday(today: NSDate) -> Int {
            var fromDate: NSDate = self
            var toDate: NSDate = today
    
            return (-NSCalendar.currentCalendar().components(.CalendarUnitMinute, fromDate: fromDate, toDate: toDate, options: nil).minute)
    
        }
    
    
        //Date Comparisions
        //https://stackoverflow.com/questions/26198526/nsdate-comparison-using-swift
    
    
        func isGreaterThanDate(dateToCompare : NSDate) -> Bool
        {
            //Declare Variables
            var isGreater = false
    
            //Compare Values
            if self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
            {
                isGreater = true
            }
    
            //Return Result
            return isGreater
        }
    
    
        // Date printing converstions
    
    
    
           var timeDayMonthYear: String {
            let dateMonthYearFormatter: NSDateFormatter = NSDateFormatter()
            let currentLocale: NSLocale = NSLocale.currentLocale()
            let dateMonthYearFormatString: NSString! = NSDateFormatter.dateFormatFromTemplate("EdMMMyyyy' ' HH':'mm",options: 0, locale: currentLocale)
            dateMonthYearFormatter.dateFormat = dateMonthYearFormatString as! String
            return dateMonthYearFormatter.stringFromDate(self)
        }
    
    
    
        static func test (mins: Int = 0) {
    
            NSLog("****************** Start Testing of NSDate **************************")
            NSLog("Inputs: mins: \(mins)")
            var today = NSDate()
            NSLog("Today is: \(today.timeDayMonthYear)")
    
                  var minsFromToday = today.xMins(mins)
            NSLog("** Date created \(mins) minutes from today is: \(minsFromToday.timeDayMonthYear)")
            //NSLog("minsFromToday returns: \(minsFromToday.minsFromToday)")
            NSLog("minsFromToday(today) returns: \(minsFromToday.minsFromToday(today))");
    
           //NSLog("hoursFromToday returns: \(minsFromToday.hoursFromToday)")
            NSLog("hoursFromToday(today) returns: \(minsFromToday.hoursFromToday(today))");
    
    
            NSLog("__________________ End Testing of NSDate    _________________________")
    
        }
    
    2015-06-13 16:23:55.362 NSDateTestCase[23758:1196619] ****************** Start Testing of NSDate **************************
    2015-06-13 16:23:55.363 NSDateTestCase[23758:1196619] Inputs: mins: 60
    2015-06-13 16:23:55.366 NSDateTestCase[23758:1196619] Today is: Sat, Jun 13, 2015, 16:23
    2015-06-13 16:23:55.367 NSDateTestCase[23758:1196619] ** Date created 60 minutes from today is: Sat, Jun 13, 2015, 17:23
    2015-06-13 16:23:55.367 NSDateTestCase[23758:1196619] minsFromToday(today) returns: 60  // All good now.
    2015-06-13 16:23:55.367 NSDateTestCase[23758:1196619] hoursFromToday(today) returns: 1 // All good now.
    2015-06-13 16:23:55.367 NSDateTestCase[23758:1196619] __________________ End Testing of NSDate    _________________________
    2015-06-13 16:23:55.368 NSDateTestCase[23758:1196619] ****************** Start Testing of NSDate **************************
    2015-06-13 16:23:55.368 NSDateTestCase[23758:1196619] Inputs: mins: -60
    2015-06-13 16:23:55.368 NSDateTestCase[23758:1196619] Today is: Sat, Jun 13, 2015, 16:23
    2015-06-13 16:23:55.369 NSDateTestCase[23758:1196619] ** Date created -60 minutes from today is: Sat, Jun 13, 2015, 15:23
    2015-06-13 16:23:55.370 NSDateTestCase[23758:1196619] minsFromToday(today) returns: -60
    2015-06-13 16:23:55.380 NSDateTestCase[23758:1196619] hoursFromToday(today) returns: -1
    2015-06-13 16:23:55.381 NSDateTestCase[23758:1196619] __________________ End Testing of NSDate    _________________________