目标C - 1970年1月1日00:00:00 UTC和给定日期之间的秒数

时间:2016-08-21 02:43:32

标签: javascript ios objective-c iphone

我正在开发的应用程序需要匹配Javascript的Date.valueOf()功能。但是,下面的Javascript和Objective-c之间的值是不同的。我做错了什么?

使用Javascript:

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 个答案:

答案 0 :(得分:0)

感谢rmaddy在Javascript中指出基于零的月份的评论。我能够通过调整JS日期构造函数和计算Objective-c的时区偏移来解决这个问题。

相关问题