这个问题并没有具体说明转换的含义,但是无论最终目标如何,您应该做的第一件事是使用正确配置的NSDateFormatter 正确解析服务器响应。这需要指定正确的格式字符串,并且必须在格式化程序上明确设置时区,否则它将从本地时间推断出来,这在大多数情况下是不正确的。
指定格式字符串
让我们看看提供的输入字符串:
20140621-061250
这使用四位数字表示年份,两位数字(用零填充)表示月份,以及两位数字(假设这些数字也将用零填充)表示一天。其后是-,然后是两个数字表示小时,2 位数字表示分钟,2 位数字表示秒。
参考Unicode date format standards,我们可以通过以下方式导出格式字符串。代表日历年的四位数字将替换为格式字符串中的yyyy。月份使用MM,当天使用dd。接下来是文字-。对于时间,我假设它将采用 24 小时格式,否则此响应会模棱两可,因此我们使用 HH。然后分钟是mm 和秒ss。连接格式说明符会产生以下格式字符串,我们将在下一步中使用它:
yyyyMMdd-HHmmss
在我们的程序中,这看起来像:
NSString *dateFormat = @"yyyyMMdd-HHmmss";
配置输入日期格式化程序
上面的时间格式没有指定时区,但是因为您已经获得了服务器响应的规范,它表示 UTC 时间,我们可以将其编码到我们的应用程序中。所以,我们实例化一个NSDateFormatter,设置正确的时区,设置日期格式:
NSTimeZone *inputTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
[inputDateFormatter setTimeZone:inputTimeZone];
[inputDateFormatter setDateFormat:dateFormat];
将输入字符串转换为NSDate
出于演示目的,我们对您从服务器响应中收到的字符串进行硬编码;您可以将 inputString 的定义替换为您从服务器获得的定义:
NSString *inputString = @"20140621-061250";
NSDate *date = [inputDateFormatter dateFromString:inputString];
此时,我们有必要的对象来进行任何进一步的转换或计算——NSDate,它表示服务器通信的时间。请记住,NSDate 只是一个时间戳 - 它与时区无关,它仅在转换为日期的字符串表示或通过NSDateComponents 表示日历日期时才起作用。
后续步骤
这个问题没有明确说明需要什么类型的转换,所以我们将看到一个格式化日期的示例,以与服务器响应相同的格式显示(虽然,我想不出可能的用途老实说,这段特殊代码的情况)。步骤非常相似——我们指定一个格式字符串、一个时区、配置一个日期格式化程序,然后从日期生成一个字符串(以指定的格式):
NSTimeZone *outputTimeZone = [NSTimeZone localTimeZone];
NSDateFormatter *outputDateFormatter = [[NSDateFormatter alloc] init];
[outputDateFormatter setTimeZone:outputTimeZone];
[outputDateFormatter setDateFormat:dateFormat];
NSString *outputString = [outputDateFormatter stringFromDate:date];
由于我在 UTC-06:00,打印 outputString 会得到以下信息:
20140621-001250
如果您要向用户显示此日期,您可能会想要使用 setDateStyle: 和 setTimeStyle: 而不是格式字符串,或者使用 NSCalendar 来获取 NSDateComponents 实例算术或计算日期。向用户显示详细日期字符串的示例:
NSTimeZone *outputTimeZone = [NSTimeZone localTimeZone];
NSDateFormatter *outputDateFormatter = [[NSDateFormatter alloc] init];
[outputDateFormatter setTimeZone:outputTimeZone];
[outputDateFormatter setDateStyle:NSDateFormatterFullStyle];
[outputDateFormatter setTimeStyle:NSDateFormatterFullStyle];
NSString *outputString = [outputDateFormatter stringFromDate:date];
在此处打印outputString 为我们提供以下信息:
2014 年 6 月 21 日星期六上午 12:12:50 山区夏令时
请注意,正确设置时区将处理夏令时的转换。使用上面的格式化程序样式代码将输入字符串更改为“20141121-061250”会给我们显示以下日期(请注意,山区标准时间是 UTC-7):
山区标准时间 2014 年 11 月 20 日星期四晚上 11:12:50
总结
每当您以字符串形式获取表示日历日期和时间的日期输入时,第一步是使用为输入格式、时区以及可能的区域设置和日历配置的NSDateFormatter 进行转换,具体取决于输入的来源和您的要求。这将产生一个NSDate,它是一个时刻的明确表示。在创建 NSDate 之后,可以根据您的应用程序需求对其进行格式化、设置样式或将其转换为日期组件。