2016-08-21 3 views
3

개발중인 앱은 Javascript의 Date.valueOf() 기능과 일치해야합니다. 그러나 아래의 자바 스크립트와 Objective-c의 값은 다릅니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?목표 C - 1970 년 1 월 1 일 00:00:00 UTC와 주어진 날짜 사이의 초

자바 스크립트 :

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

목표 - 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 명령은 달이 0 일 것으로 예상하여 2016 년 9 월 21 일에 실제로 날짜를 지정했습니다. – rmaddy

+0

Thanks @rmaddy. JS 날짜 생성자를 수정했습니다. 또한 Objective-c 표준 시간대 오프셋을 설명합니다. 결과는 이제 동일합니다. – uxnow

답변

0

rmaddy님께 서 자바를 사용하여 0 기준 개월을 지적 해 주셔서 감사드립니다. JS 날짜 생성자를 조정하고 Objective-c의 시간대 오프셋을 계산하여이 문제를 해결할 수있었습니다.

관련 문제