代码之家  ›  专栏  ›  技术社区  ›  just_another_coder

根据特定时区计算日期

  •  2
  • just_another_coder  · 技术社区  · 15 年前

    使用NSDate对我来说很棘手。我知道它代表一个特定的时间点,而不是特定的时区或地区。我还阅读了许多关于NSDateFormatter、NSCalendar、NSDateComponents、NSlocale和NSTimeZone的文档。

    我试图根据两个特定的太平洋时区进行计算。例如,我希望能够计算从日期A到日期B的天数。我不希望通过解析字符串来“破解”它,因为我希望还可以计算DST之类的内容。

    有人能推荐一种方法吗?

    编辑:找到解决方案:

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"PST"];
    [calendar setTimeZone:zone];
    NSDateComponents *comp = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];
    date = [calendar dateFromComponents:comp];
    [calendar release];
    

    这将导致日期本地化为太平洋时间。我知道这会导致不同地区出现问题,但我的应用程序是独一无二的,这是合理的。

    然后,我可以使用发布的86400个分区来比较日期。

    虽然,这看起来有点过火了-很多额外的工作-也许有一个更短的方法来获得一个特定时区的约会?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Ole Begemann    15 年前

    你应该创造两个 NSDate 表示要比较的两个日期的实例。为此,您可以设置 NSDateComponents 实例并不仅设置其日/月/年/小时,还设置其时区( -[NSDateComponents setTimeZone:] ). 然后打电话 -[NSDateComponents date] 把它们转换成 N日期 .

    [date1 timeIntervalSinceDate:date2] 然后给出两个日期之间的差异(以秒为单位)。将结果除以86400得到天数。

    或者,你可以打电话给 [NSCalendar components:fromDate:toDate:options:] NSDateComponent 实例直接获取 NSDateComponents公司 两者的区别。

        2
  •  4
  •   Pieter Jongsma    15 年前

    您还可以将两个NSDate对象转换为GMT。如下所示:

    NSDate *date;
    NSTimeZone *timeZone;
    NSDate *gmtDate = [date dateByAddingTimeInterval:-[timeZone secondsFromGMTForDate:date]];
    

    然后将NSCalendar的时区设置为GMT。如下所示:

    NSCalendar *calendar;
    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0];
    

    然后,您可以使用日历和您的GMT日期来计算您需要知道的任何内容。

        3
  •  3
  •   Pieter Jongsma    15 年前

    我想你可以计算出时区之间的差异。这样地:

    NSDate *date1;
    NSDate *date2;
    NSTimeInterval dateDifference = [date1 timeIntervalSinceDate:date2];
    

    然后计算时区差。这样地:

    NSTimeZone *timeZone1;
    NSTimeZone *timeZone2;
    // Assuming date1 is in timeZone1...
    NSTimeInterval timeZoneDifference = [timeZone1 secondsFromGMTForDate:date1] - [timeZone2 secondsFromGMTForDate:date2];
    

    然后把两者相加。这样地:

    NSTimeInterval difference = dateDifference + timeZoneDifference;
    
    推荐文章