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がタイムゾーンオフセットを考慮して更新されました。現在、結果に差はありません。
投稿したJavascriptの値が2016年8月21日に正しくありません。Objective-Cの値が正しいです。それは私のコンピュータ上で 'date +%s'コマンドを実行したものと十分に近いものです。 – rmaddy
FYI - Javascript Dateコマンドで月がゼロになると予想されるため、2016年9月21日に実際に日付を指定しました。 – rmaddy
ありがとう@rmaddy。私は、JSの日付コンストラクタを修正するために編集しました。また、Objective-cタイムゾーンオフセットを考慮しました。結果は同じです。 – uxnow