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

时间:2015-05-27 09:37:00

标签: ios objective-c nsdate nsdateformatter nstimezone

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

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

请指出我是否遗漏了某些东西

4 个答案:

答案 0 :(得分:2)

如果您使用NSLog显示日期,则会以UTC格式显示。所以要么你必须转换,要么不使用它。我在一个不同的问题上写了很长的answer explaining this

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

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

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

如果要将位置中某个时间点的表示转换为其他位置的不同表示,则必须使用两个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

答案 1 :(得分:0)

此行以GMT格式打印日期/时间,因为它调用[NSDate description]systemTimeZone和GMT之间存在潜在差异,因此您看到的差异为:

NSLog(@"%@",currentDate);

如果您想查看特定时区的日期/时间,请使用NSDateFormatter对象获取字符串。

答案 2 :(得分:0)

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

现在巴黎比UTC早两个小时。结果绝对正确。 NSDate以UTC格式保留日期。这个想法是,如果任何两个人在同一时刻看他们的手表,并将他们在手表上看到的时间转换为NSDate,他们将获得相同的结果。

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

答案 3 :(得分:0)

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

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

您已成功从字符串表示中解析currentDate。如果要反转该过程并获取字符串表示,请使用[currentDateFormatter stringFromDate:currentDate]