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

Ios 将日期字符串(任意时区)转换为法国时区的NSDate时出现的问题,ios,objective-c,nsdate,nsdateformatter,nstimezone,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:@"E

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

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 -->法国时区是格林尼治标准时间+2

日期字符串=2015年5月27日-19:00

预期结果=2015年5月27日-16:00

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

实际结果(NSString自日期起)=2015年5月27日-19:00


请指出,如果我遗漏了什么

这一行以GMT打印日期/时间,它称之为
[NSDate description]
,并且
系统时区
和GMT之间存在潜在差异,因此您看到的差异是:

NSLog(@"%@",currentDate);
如果要查看特定时区的日期/时间,请使用
NSDateFormatter
对象获取字符串。

检查

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


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

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

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


您已经成功地从字符串表示中解析了
currentDate
。如果要反转此过程并获取字符串表示形式,只需使用
[currentDateFormatter stringFromDate:currentDate]

如果使用
NSLog
显示日期,则它将以UTC显示。所以,要么你必须在头脑中转换,要么不要使用它。我写了一封长长的信来回答另一个问题

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

你得到的结果和人们所期望的完全一样

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

如果要将所在位置的时间点表示形式转换为不同位置的不同表示形式,则必须使用两个日期格式化程序

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

是的,我知道结果是正确的,但如何从当前时区的字符串中获取日期最后一行打印的是什么?请添加实际输出,因为大多数错误不是真正的错误,而是输出的错误读数。2015-05-27 01:00而不是2015-05-27 03:00,时区偏移量为+0000基本上,我想将日期从当前时区转换为法国时区。我只有一个日期字符串。但当我将字符串转换为date时,返回的是W.R.T GMT,它与当前时区不同,因此在我的最终结果中产生了差异。如果你能在这个场景中帮助我,我将非常高兴。@MuhammadIrfan你错了,我重复一遍。日期在任何时区都不会返回,但NSLog会将其转换为GMT格式的字符串。您必须使用
currentDate
并使用法语时区通过
NSDateFormatter
运行它。@MuhammadIrfan,请更新您的问题,不要将代码粘贴到注释中。我已经编辑了问题。现在请看一下