Swift / iOS:30日NSDateComponent的极端奇怪行为

时间:2014-07-01 02:07:33

标签: ios date swift nsdateformatter

我看到很多关于iOS日历的“奇怪行为”帖子,但这个帖子似乎没有在那里,所以我会把它添加到堆中。

我有一个课程,除其他外,计算两个日期之间的差异,并将其显示为月,日和年的时间段。

我需要回去在ObjC中进行测试,但我不认为它会在那里发生,因为这是我几年前在C中写的一个非常古老的应用程序的重写。

现在,今天是6月30日,我正在编写单元测试,并注意到日历给出了两个不同日期的相同计数。

确切地说,它表示2012年12月30日至2014年6月30日正好是1年零6个月。

我还说2012年12月31日到2014年6月30日是1年零6个月。究竟。它应该是1年零5个月30天(我相信)。

在任何情况下,两个日期都不应创建相同的时间间隔。

这是我正在使用的代码。我看不出任何我做错的事。有线索吗?

BTW:无论出于何种原因,此代码都无法在操场上使用。也许我对系统要求太高了。

import Foundation

class Gonkulator
{
    var years:Int
    var months:Int
    var days:Int

    init ( inStartDate:NSDate, inNowDate:NSDate )
    {
        // The reason for all this wackiness, is we want to completely strip out the time element of each date. We want the days to be specified at noon.
        var fromString:String = NSDateFormatter.localizedStringFromDate ( inStartDate, dateStyle: NSDateFormatterStyle.ShortStyle, timeStyle: NSDateFormatterStyle.NoStyle )
        var toString:String = NSDateFormatter.localizedStringFromDate ( inNowDate, dateStyle: NSDateFormatterStyle.ShortStyle, timeStyle: NSDateFormatterStyle.NoStyle )

        var dateFormatter = NSDateFormatter()
        dateFormatter.timeStyle = .NoStyle
        dateFormatter.dateStyle = .ShortStyle

        // We have stripped out the time information, and each day is at noon.
        var startDate:NSDate = dateFormatter.dateFromString ( fromString ).dateByAddingTimeInterval ( 43200 )    // Make it Noon, Numbah One.
        var stopDate:NSDate = dateFormatter.dateFromString ( toString ).dateByAddingTimeInterval ( 43200 )

        // Get the Gregorian calendar
        let myCalendar: NSCalendar = NSCalendar ( calendarIdentifier:NSGregorianCalendar )

        // Create our answer from the components of the result.
        var components = myCalendar.components ( NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit | NSCalendarUnit.DayCalendarUnit, fromDate: startDate, toDate: stopDate, options: nil )
        self.years = components.year
        self.months = components.month
        self.days = components.day

//        DEBUG DISPLAY
//        fromString = NSDateFormatter.localizedStringFromDate ( startDate, dateStyle: NSDateFormatterStyle.ShortStyle, timeStyle: NSDateFormatterStyle.NoStyle )
//        toString = NSDateFormatter.localizedStringFromDate ( stopDate, dateStyle: NSDateFormatterStyle.ShortStyle, timeStyle: NSDateFormatterStyle.NoStyle )
//        println ( "Start Date: " + fromString + " -Years: \(self.years), Months: \(self.months), Days: \(self.days)" )
//        println ( "End Date: " + toString )
    }
}

var dateFormatter = NSDateFormatter()
dateFormatter.timeStyle = .NoStyle
dateFormatter.dateStyle = .ShortStyle

var startDate:NSDate = dateFormatter.dateFromString ( "12/30/12" ).dateByAddingTimeInterval ( 43200 )    // Make it Noon, Numbah One.
var stopDate:NSDate = dateFormatter.dateFromString ( "06/30/14" ).dateByAddingTimeInterval ( 43200 )

// First create an instance for December 30, 18 months ago
let test = Gonkulator ( inStartDate: startDate, inNowDate: stopDate )
var years = test.years      // This will be 1
var months = test.months    // This will be 6
var days = test.days        // This will be 0

startDate = dateFormatter.dateFromString ( "12/31/12" ).dateByAddingTimeInterval ( 43200 )

// Next, create an instance for December 31
let test2 = Gonkulator ( inStartDate: startDate, inNowDate: stopDate )
years = test2.years      // This will be 1
months = test2.months    // This will be 6 #WhiskeyTangoFoxtrot
days = test2.days        // This will be 0 #WhiskeyTangoFoxtrot

首次通话验证为:One year and six months

第二个实例应为One year, five months and thirty days

0 个答案:

没有答案