我正在处理一个编程糟糕的第三方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];