如何确定具体日期是否为夏令时?

时间:2013-05-30 00:51:51

标签: ios timezone nsdate nsdateformatter

我正在处理一个程序错误的第三方API,迫使我按照目标C按摩一些日期/时间数据。

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

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

2 个答案:

答案 0 :(得分:6)

好吧,我不认为 是一种正确的方法。有这样的API,例如:

[NSTimeZone isDaylightSavingTimeForDate:][NSTimeZone daylightSavingTimeOffsetForDate:]

但是在从CDT到CST的过渡中,将重复一个小时,因此无法知道它是CDT还是CST。除了假设CST和检查夏令时的那一小时应该有效。我的建议是设置任何编写此API的人。

答案 1 :(得分:0)

我认为我有一个解决方案:

    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];