Marty Cullen
Marty Cullen

Reputation: 210

Calculation of DayInEra inconsistent with DayInYear

If I have a date late in the evening and I live on the US East coast, my DayInEra calculation seems to not be including the timezone offset. But my DayInYear calculation works fine.

I put the following in a playground to isolate the issue from my code:

var dateLastNite : NSDate = NSDate(timeIntervalSince1970: 1430190884.0)
var dateMorning : NSDate = NSDate(timeIntervalSince1970: 1430224884.0)
var dateEvening : NSDate = NSDate(timeIntervalSince1970: 1430276884.0)

var curCal : NSCalendar = NSCalendar.currentCalendar()
var tz : NSString = curCal.timeZone.abbreviation!

var dayOfYearPast : NSInteger = curCal.ordinalityOfUnit(NSCalendarUnit.CalendarUnitDay, inUnit: NSCalendarUnit.CalendarUnitYear, forDate: dateLastNite)
var dayOfYearAM   : NSInteger = curCal.ordinalityOfUnit(NSCalendarUnit.CalendarUnitDay, inUnit: NSCalendarUnit.CalendarUnitYear, forDate: dateMorning)
var dayOfYearPM   : NSInteger = curCal.ordinalityOfUnit(NSCalendarUnit.CalendarUnitDay, inUnit: NSCalendarUnit.CalendarUnitYear, forDate: dateEvening)

var dayOfEraPast : NSInteger = curCal.ordinalityOfUnit(NSCalendarUnit.CalendarUnitDay, inUnit: NSCalendarUnit.CalendarUnitEra, forDate: dateLastNite)
var dayOfEraAM   : NSInteger = curCal.ordinalityOfUnit(NSCalendarUnit.CalendarUnitDay, inUnit: NSCalendarUnit.CalendarUnitEra, forDate: dateMorning)
var dayOfEraPM   : NSInteger = curCal.ordinalityOfUnit(NSCalendarUnit.CalendarUnitDay, inUnit: NSCalendarUnit.CalendarUnitEra, forDate: dateEvening)

The DayOfYearPast result is 117 and both the AM and PM have 118

But for DayOfEraPast and dayOfEraAM I get 735716 And DayOfEraPM I get 735717

Any explanation of why the era results were not: 735716 735717 735717 as I expected

Upvotes: 0

Views: 111

Answers (1)

Rupert Pupkin
Rupert Pupkin

Reputation: 790

When using the era bit, the era is based on an absolute moment in time (when JC was born). The fact that your local clock passed midnight from dateLastNite to dateMorning does not guarantee that the moment in time passed a 24 hour crossover (as computer from the beginning of the era).

See Listing 13 and 14:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html

Upvotes: 1

Related Questions