6

我正在处理一个编程错误的第 3 方 API,它迫使我在目标 C 中处理一些日期/时间数据。

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

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

4

2 回答 2

8

好吧,我认为没有正确的方法可以做到这一点。有用于此的 API,例如:

[NSTimeZone isDaylightSavingTimeForDate:][NSTimeZone daylightSavingTimeOffsetForDate:]

但是在从 CDT 到 CST 的过渡中,将重复一小时,因此无法知道它是 CDT 还是 CST。除了假设 CST 和检查夏令时的一小时之外应该工作。我的建议是让编写这个 API 的人着火。

于 2013-05-30T01:21:22.527 回答
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];
于 2013-05-30T03:53:58.477 回答