2016-08-21 8 views
3

私が開発しているアプリケーションは、JavascriptのDate.valueOf()の機能と一致する必要があります。ただし、以下のJavascriptとObjective-cの値は異なります。私は間違って何をしていますか?目的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

FYI - Javascript Dateコマンドで月がゼロになると予想されるため、2016年9月21日に実際に日付を指定しました。 – rmaddy

+0

ありがとう@rmaddy。私は、JSの日付コンストラクタを修正するために編集しました。また、Objective-cタイムゾーンオフセットを考慮しました。結果は同じです。 – uxnow

答えて

0

rmaddyのコメントのおかげで、Javascriptでゼロに基づく月が指摘されました。私はJSの日付コンストラクタを調整し、Objective-cのタイムゾーンオフセットを調整することでこれを解決できました。

関連する問題