Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 目标C-1970年1月1日00:00:00 UTC和给定日期之间的秒数_Javascript_Ios_Objective C_Iphone - Fatal编程技术网

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

Javascript 目标C-1970年1月1日00:00:00 UTC和给定日期之间的秒数,javascript,ios,objective-c,iphone,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 NSDateFormatter *formatter = [[NSDateFormatter alloc] in

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

Javascript:

var d = new Date('2016-08-21T09:00:00')
console.debug(d.valueOf()/1000);
// Result: 1471734000
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
目标-c:

var d = new Date('2016-08-21T09:00:00')
console.debug(d.valueOf()/1000);
// Result: 1471734000
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以说明时区偏移。现在结果没有差别。

感谢rmaddy在Javascript中指出了以零为基础的月份。我可以通过调整JS日期构造函数并考虑Objective-c的时区偏移来解决这个问题

您发布的Javascript值在2016年8月21日不正确。目标C值是正确的。它与我在我的计算机上运行
date+%s
命令得到的结果相匹配(足够接近)。仅供参考-Javascript date命令预期月份为零,因此您实际指定了2016年9月21日的日期。谢谢@rmaddy。我已经编辑修复了JS日期构造函数。还考虑了Objective-c时区偏移。结果现在相同。您可以使用
NSDate
的属性
timeIntervalSince1970
endDate.timeIntervalSince1970