我看到很多关于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