如何确定特定日期是否为夏令时



我正在处理一个编程糟糕的第三方API,它迫使我在目标c中处理一些日期/时间数据。

它不是以UTC的绝对UNIX时间戳返回日期,而是以不带时区信息的格式化字符串返回日期。(事实证明,在与他们的一个开发人员交谈后,他们实际上是将日期/时间存储在他们的数据库中作为一个没有时区信息的字符串,而不是作为时间戳!)服务器在美国中部的某个地方,所以它目前在CDT上,所以理论上我可以将'CDT'添加到格式化的日期并使用NSDateFormatter (yyyy-MM-dd HH:mm:ss zzz)来构造一个NSDate。然而,根据所讨论的日期来自一年中的时间,它可能是CST或CDT。

我如何确定夏令时是否在该特定日期生效,以便我可以添加适当的时区并计算正确的UTC日期?

嗯,我不认为有一个正确的方法来做到这一点。有这样的api:

[NSTimeZone isDaylightSavingTimeForDate:][NSTimeZone daylightSavingTimeOffsetForDate:]

BUT在从CDT到CST的转换中,一个小时将重复,因此无法知道它是CDT还是CST。除了一个小时假设CST和检查夏令时应该工作。我的建议是让写这个API的人火起来

我想我有一个解决方案:

    NSString *originalDateString = <ORIGINAL DATE FROM API>;
    NSDateFormatter *dateStringFormatter = [[NSDateFormatter alloc] init];
    dateStringFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss zzz";
    NSString *tempDateString = [originalDateString stringByAppendingFormat:@" CST"];
    // create a temporary NSDate object
    NSDate *tempDate = [dateStringFormatter dateFromString:tempDateString];
    // get the time zone for this NSDate (it may be incorrect but it is an NSTimeZone object)
    NSDateComponents *components = [[NSCalendar currentCalendar]
                                    components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSTimeZoneCalendarUnit
                                    fromDate:tempDate];
    NSTimeZone *tempTimeZone = [components timeZone];
    // Find out if the time zone of the temporary date
    // (in CST or CDT depending on the local time zone of the iOS device)
    // **would** use daylight savings time for the date in question, and
    // select the proper time zone
    NSString *timeZone;
    if ([tempTimeZone isDaylightSavingTimeForDate:tempDate]) {
        timeZone = @"CDT";
    } else {
        timeZone = @"CST";
    }
    NSString *finalDateString = [originalDateString stringByAppendingFormat:@" %@", timeZone];

相关内容

  • 没有找到相关文章

最新更新