将日期字符串(任何时区)转换为法国时区的 NSDate 的问题

Issues in converting date string (any time zone) to NSDate of French Time Zone

我想将日期字符串(可以在任何时区)转换为法国时区的日期。我正在使用以下代码。

NSString * dateString = @"27/05/2015 - 19:00" // system time zone is GMT +5
NSDateFormatter* frenchDateFormatter = [[NSDateFormatter alloc] init];
[frenchDateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Paris"]];
[frenchDateFormatter setDateFormat:@"dd/MM/yyyy - HH:mm"];
NSDate *frenchDate = [frenchDateFormatter dateFromString:dateString];
NSLog(@"%@",frenchDate);
NSString * frenchString = [frenchDateFormatter stringFromDate:frenchDate];`

详细说明 --> 系统时区是 GMT +5 --> 法国时区是 GMT +2

日期字符串 = 27/05/2015 - 19:00

预期结果 = 27/05/2015 - 16:00

实际结果 (NSDate) = 2015-05-27 17:00:00 +0000

实际结果(从日期开始的 NSString)= 27/05/2015 - 19:00

如有遗漏请指出

此行在 GMT 中打印出 date/time,因为它称为 [NSDate description],并且 systemTimeZone 和 GMT 之间存在潜在差异,因此您看到的差异是:

NSLog(@"%@",currentDate);

如果您想查看特定时区的 date/time 是什么,请使用 NSDateFormatter 对象获取字符串。

查看 http://www.timeanddate.com/worldclock/

现在巴黎时间比世界标准时间早两个小时。结果完全正确。 NSDate 以 UTC 格式保存日期。这个想法是,如果任何两个人同时看他们的手表,并将他们在手表上看到的时间转换为 NSDate,他们将得到相同的结果。

您无法获取时区的 NSDate。 NSDate 不支持时区。获取带有时区的日期的唯一方法是使用 NSDateFormatter 将其转换为字符串。

日期没有时区信息。日期在内部表示为数字。我们不需要知道任何有关该数字的信息(它是从 UTC 中的固定日期算起的秒数),重要的是要了解要向用户显示日期,您必须先将其转换为字符串。

数字的字符串表示形式是使用日期格式和时区从日期生成的。对于所有日期 -> 字符串和字符串 -> 日期转换,您可以使用 NSDateFormatter.

您已从字符串表示中成功解析 currentDate。如果你想反转这个过程并获得字符串表示,只需使用 [currentDateFormatter stringFromDate:currentDate]

如果您使用 NSLog 显示日期,它将以 UTC 显示。所以要么你必须在头脑中转换,要么不要使用它。我写了一个很长的 answer explaining this 给另一个问题。

因为您已将解析 dateFormatter 的时区设置为巴黎,所以您解析的字符串被视为 "time in paris"。那是你的问题,你实际上想在当地时间解析它。

您得到的结果完全符合预期。

您创建了一个与“巴黎 19:00”相关的 NSDate。由于巴黎是 UTC+2,因此日期是 UTC(或 +0000)的 17:00。如果将该日期转换回 "time in Paris",您最终会得到与之前相同的字符串。

如果您想将您所在位置的时间点表示转换为不同位置的不同表示,您必须使用两个 dateFormatters。

NSString *localDateString = @"27/05/2015 - 19:00" // system time zone is GMT +5

NSDateFormatter* localDateFormatter = [[NSDateFormatter alloc] init];
[localDateFormatter setTimeZone:[NSTimeZone localTimeZone]];
[localDateFormatter setDateFormat:@"dd/MM/yyyy - HH:mm"];

NSDate *date = [localDateFormatter dateFromString:localDateString];       // date contains point in time. It no longer has a timezone

NSDateFormatter* franceDateFormatter = [[NSDateFormatter alloc] init];
[franceDateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Paris"]];
[franceDateFormatter setDateFormat:@"dd/MM/yyyy - HH:mm"];

NSString * timeInFranceString = [franceDateFormatter stringFromDate:date]; // representation of the point in time from above for people in Paris