将日期字符串(任何时区)转换为法国时区的 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
我想将日期字符串(可以在任何时区)转换为法国时区的日期。我正在使用以下代码。
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