【问题标题】:Objective C - Seconds between 1 January 1970 00:00:00 UTC and a given date目标 C - 1970 年 1 月 1 日 00:00:00 UTC 和给定日期之间的秒数
【发布时间】:2016-12-27 21:01:39
【问题描述】:

我正在开发的应用程序需要匹配 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 以考虑时区偏移。现在结果没有区别了。

【问题讨论】:

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

标签: javascript ios objective-c iphone


【解决方案1】:

感谢 cmets by rmaddy 指出 Javascript 中从零开始的月份。我能够通过调整 JS 日期构造函数并考虑 Objective-c 的时区偏移来解决这个问题。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2013-05-31
    • 1970-01-01
    • 2017-06-21
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多