0

我正在尝试将时间字符串从一个时区转换为 NSDate 对象,然后使用本地时区将其输出回字符串。不过,我似乎要出去 1 小时。例如,我添加了输出时区,以便显示错误。有一些类似的问题,但没有任何迹象表明我在哪里出错了!!!在发布此消息时,两个时区目前都处于夏令时 - 但是 NSDateFormatter 应该处理基于时区的任何差异。

更新:问题似乎在于将 LA 时间转换为 GMT,而不是转换为 BST。据我所知,所有 NSDate 都存储为 GMT。下面的代码演示了这一点(添加了语言环境 - 似乎没有什么区别):

NSDateFormatter *dateF = [[NSDateFormatter alloc] init];
[dateF setDateFormat:@"HH:mm"];
[dateF setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]];
[dateF setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
NSDate* sourceDate = [dateF dateFromString:@"09:15"];

NSLog(@"Date GMT: %@", [sourceDate description]);
NSLog(@"Date BST: %@", [sourceDate descriptionWithLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]]);

输出:

格林威治标准时间:1970-01-01 17:15:00 +0000这是不正确的!

日期 BST:1970 年 1 月 1 日星期四 18:15:00 GMT+01:00因此这也是不正确的

原始示例

洛杉矶的 09:15 应该是伦敦的 17:15,而不是 18:15...

NSDateFormatter *dateF = [[NSDateFormatter alloc] init];
[dateF setDateFormat:@"HH:mm"];
[dateF setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]];

NSDate* sourceDate = [dateF dateFromString:@"09:15"];

NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"HH:mm"];
[dateformatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/London"]];
NSLog(@"%@", [dateformatter stringFromDate:sourceDate]);
4

2 回答 2

0

NSDate 对象以绝对时间存储日期。例如,清单 16 中创建的日期对象表示 4:00 PM CDT、5:00 EDT,等等。

NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CDT"]];
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init];
[timeZoneComps setHour:16];
//specify whatever day, month, and year is appropriate
NSDate `enter code here`*date=[gregorian dateFromComponents:timeZoneComps];
于 2012-07-17T16:56:52.310 回答
0

来自 NSTimeZone 文档:

请注意,严格来说,时区数据库条目(例如“America/Los_Angeles”)是 ID,而不是名称。时区名称的一个示例是“太平洋夏令时间”。尽管许多 NSTimeZone 方法名称都包含“名称”一词,但它们指的是 ID。

https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSTimeZone_Class/Reference/Reference.html

于 2014-07-11T06:57:04.260 回答