diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index a46a44c3e..6ba8d8629 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -182,17 +182,25 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 1, 1, 0, 0, 0, 0)); return (self > anotherDate) ? self : anotherDate; } +/*! + Returns timezone offset as a string in ±HHMM format +*/ ++ (CPString)timezoneOffsetString:(int)timezoneOffset +{ + var offset = -timezoneOffset, + positive = offset >= 0, + hours = positive ? FLOOR(offset / 60) : CEIL(offset / 60), + minutes = offset - hours * 60; + return [CPString stringWithFormat:@"%s%02d%02d", positive ? "+" : "-", ABS(hours), ABS(minutes)]; +} + /*! Returns the date as a string in the international format YYYY-MM-DD HH:MM:SS ±HHMM. */ - (CPString)description { - var positive = self.getTimezoneOffset() >= 0, - hours = FLOOR(self.getTimezoneOffset() / 60), - minutes = self.getTimezoneOffset() - hours * 60; - - return [CPString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d %s%02d%02d", self.getFullYear(), self.getMonth()+1, self.getDate(), self.getHours(), self.getMinutes(), self.getSeconds(), positive ? "+" : "-", ABS(hours), ABS(minutes)]; + return [CPString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d %s", self.getFullYear(), self.getMonth()+1, self.getDate(), self.getHours(), self.getMinutes(), self.getSeconds(), [CPDate timezoneOffsetString:self.getTimezoneOffset()]]; } - (id)copy diff --git a/Tests/Foundation/CPDateTest.j b/Tests/Foundation/CPDateTest.j index 62d9600b2..4aae155c4 100644 --- a/Tests/Foundation/CPDateTest.j +++ b/Tests/Foundation/CPDateTest.j @@ -69,12 +69,13 @@ expectedDay = 13, expectedHour = 23, expectedMinute = 31, - offsetPositive = date.getTimezoneOffset() >= 0, - offsetHours = Math.floor(date.getTimezoneOffset() / 60), - offsetMinutes = date.getTimezoneOffset() - offsetHours * 60, + offset = -date.getTimezoneOffset(), + offsetPositive = offset >= 0, + offsetHours = offsetPositive ? Math.floor(offset / 60) : Math.ceil(offset / 60), + offsetMinutes = offset - offsetHours * 60, expectedString; - expectedHour -= offsetHours; - expectedMinute -= offsetMinutes; + expectedHour += offsetHours; + expectedMinute += offsetMinutes; if (expectedMinute < 0) { expectedMinute += 60; @@ -102,6 +103,14 @@ expectedString = [CPString stringWithFormat:"2009-02-%02d %02d:%02d:30 -%02d%02d", expectedDay, expectedHour, expectedMinute, ABS(offsetHours), ABS(offsetMinutes)]; [self assert:expectedString equals: [date description]]; + + // Now test that timezone convertion algorithm in CPDate works correctly for + // different timezones + [self assert:"+0000" equals: [CPDate timezoneOffsetString:0]]; + [self assert:"-0900" equals: [CPDate timezoneOffsetString:+540]]; + [self assert:"+0300" equals: [CPDate timezoneOffsetString:-180]]; + [self assert:"-0130" equals: [CPDate timezoneOffsetString:+90]]; + [self assert:"+0130" equals: [CPDate timezoneOffsetString:-90]]; } - (void)testCopy