我正在处理一个程序错误的第三方API,迫使我按照目标C按摩一些日期/时间数据。
它不是将日期作为绝对UNIX时间戳以UTC格式返回,而是将日期作为带有时区信息的格式化字符串返回。 (事实证明,在与他们的一位开发人员交谈之后,他们实际上将日期/时间存储在他们的数据库中作为没有时区信息的字符串,而不是时间戳!)服务器是在美国中部的某个地方所以它目前在CDT上,所以理论上我可以在格式化日期添加“CDT”并使用NSDateFormatter(yyyy-MM-dd HH:mm:ss zzz
)来构建NSDate。但是,根据有关日期的年份,可能是CST或CDT。
如何确定夏令时是否在该特定日期生效,以便我可以附加正确的时区并计算正确的UTC日期?
答案 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];