2016-08-21 74 views
3

我正在開發的應用程序需要與Javascript的Date.valueOf()的功能相匹配。但是下面的Javascript和Objective-c之間的值是不同的。我究竟做錯了什麼?Objective C - 1970年1月1日00:00:00 UTC和給定日期之間的秒數

的Javascript:

var d = new Date('2016-08-21T09:00:00') 
console.debug(d.valueOf()/1000); 
// Result: 1471734000 

的Objective-C:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[formatter setDateFormat:@"YYYY-MM-dd H:mm:ss"]; 
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
[gregorianCalendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
NSDateComponents *startDateComponents = [[NSDateComponents alloc] init]; 
[startDateComponents setYear:1970]; 
[startDateComponents setMonth:1]; 
[startDateComponents setDay:1]; 
[startDateComponents setHour:0]; 
[startDateComponents setMinute:0]; 
[startDateComponents setSecond:0]; 
[startDateComponents setNanosecond:0]; 
NSDate *startDate = [gregorianCalendar dateFromComponents:startDateComponents]; 
NSString* startDateString = [formatter stringFromDate:startDate]; 
NSDateComponents *endDateComponents = [[NSDateComponents alloc] init]; 
[endDateComponents setYear:2016]; 
[endDateComponents setMonth:8]; 
[endDateComponents setDay:21]; 
[endDateComponents setHour:9]; 
[endDateComponents setMinute:0]; 
[endDateComponents setSecond:0]; 
[endDateComponents setNanosecond:0]; 
NSDate *endDate = [gregorianCalendar dateFromComponents:endDateComponents]; 
NSString* endDateString = [formatter stringFromDate:endDate]; 
NSTimeInterval distanceBetweenDates = [endDate timeIntervalSinceDate:startDate]; 
distanceBetweenDates -= timezoneoffset; 
printf("Seconds between %s and %s = %f\n", [startDateString UTF8String], [endDateString UTF8String], distanceBetweenDates); 
// Result: Seconds between 1970-01-01 0:00:00 and 2016-08-21 9:00:00 = 1471734000 

編輯:更新JS日期構造函數根據註釋。 編輯:已更新Objective-c來考慮時區偏移量。結果現在沒有區別。

+1

您發佈的Javascript值在2016年8月21日不正確。Objective-C值是正確的。它匹配(足夠接近)我在計算機上運行'date +%s'命令的內容。 – rmaddy

+1

僅供參考 - Javascript Date命令預計該月爲零,因此您實際上指定了2016年9月21日的日期。 – rmaddy

+0

Thanks @rmaddy。我已編輯修復JS日期構造函數。也佔了Objective-c時區的偏移量。結果現在完全相同。 – uxnow

回答

0

感謝rmaddy在Javascript中指出了基於零的月份的評論。我能夠通過調整JS日期構造函數和計算Objective-c的時區偏移量來解決此問題。

相關問題