我想将日期字符串(可以在任何时区)转换为法国时区的日期。我正在使用以下代码。
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
请指出我是否遗漏了某些东西
答案 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]