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

Ios 如何确定具体日期是否为夏令时?,ios,timezone,nsdate,nsdateformatter,Ios,Timezone,Nsdate,Nsdateformatter,我正在处理一个编程糟糕的第三方API,它迫使我在objective C中处理一些日期/时间数据 它不是以UTC的绝对UNIX时间戳形式返回日期,而是以格式化字符串形式返回日期,不包含时区信息。事实证明,在与他们的一位开发人员交谈后,他们实际上是将日期/时间作为字符串存储在数据库中,而不是作为时间戳,而不是时区信息!服务器位于美国中部的某个地方,所以它目前在CDT上,所以理论上,我可以将“CDT”添加到格式化的日期中,并使用NSDATEFALATER YYYY MM DD HH:MM:SS ZZZ

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

它不是以UTC的绝对UNIX时间戳形式返回日期,而是以格式化字符串形式返回日期,不包含时区信息。事实证明,在与他们的一位开发人员交谈后,他们实际上是将日期/时间作为字符串存储在数据库中,而不是作为时间戳,而不是时区信息!服务器位于美国中部的某个地方,所以它目前在CDT上,所以理论上,我可以将“CDT”添加到格式化的日期中,并使用NSDATEFALATER YYYY MM DD HH:MM:SS ZZZ构建NSDET。但是,根据所述日期的来源时间,可以是CST或CDT

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

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

[NSTimeZone IsDaylightSavingTimeOrDate:]和[NSTimeZone daylightSavingTimeOffsetForDate:]


但在从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];

右-最好的选择是更改API。不幸的是,我没有权力这么做。有没有办法从NSDate获取NSTimeZone?这样我就可以使用isDaylightSavingsTimeForDate:方法了。@Jason请小心。NSDate与NSTimeZone无关unix戳记是否有时区?不,也是出于同样的原因。时区在日期格式化程序中,而不是日期本身。因此,正如我上面所说的,假设CST使用该缩写创建一个时区,在格式化程序上设置该时区,并使用格式化程序创建一个NSDate对象。除了重复的一个小时外,它还能工作。如果夏令时有效,则适当调整NSDate。我同意在DST回退过渡期间重复一小时。如果没有API中的其他信息,你只能猜测这两种信息中的哪一种,你可能错了。我也想找到那个家伙。小心时区缩写。我不太清楚iOS是如何处理它的,但是有许多区域使用相同的缩写。你可以看到一个列表。例如,CST可能意味着中国标准时间……我想知道你是否可以通过美国/芝加哥地区id?如果是这样的话,你可能就不必先检查IsDaylightSavingStime了。它可能会在内部完成这项工作。我只是在猜测——我不是iOS/ObjectiveCdeveloper@MattJohnson这对于这个API来说没有意义,因为美国/芝加哥将取决于日期,而时区则不是。此外,此API的一种更快的方法是,只需将daylightSavingTimeOffsetForDate:添加到您在tempDate中创建的日期,而不是创建另一个格式化程序。如果夏令时无效,则为零。@MattJohnson不幸的是,iOS不会从日期格式化程序自动确定夏令时。如果我在应该是CDT的时候设置CST,它会关闭一个小时。@Jason他的意思是通过美国/芝加哥而不是CST,让系统确定实际时区:。此外,您可以考虑通过名称而不是缩写来构造时区,以避免他上面提到的问题。