20140621-061250
如何将其转换为当地时间?
我如何定义我的日期格式化程序?它是否正确?
dateFormatter.dateFormat = @"YYYYMMd-HHmmss";
解决方法
指定格式字符串
我们来看看提供的输入字符串:
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这里给出了以下内容:
Saturday,June 21,2014 at 12:12:50 AM Mountain Daylight Time
请注意,正确设置时区将处理夏令时的转换.将输入字符串更改为“20141121-061250”,使用上面的格式化程序样式代码可以显示以下日期(请注意,山地标准时间为UTC-7):
Thursday,November 20,2014 at 11:12:50 PM Mountain Standard Time
概要
任何时间以表示日历日期和时间的字符串形式输入日期输入,您的第一步是使用为输入格式,时区和可能的区域设置和日历配置的NSDateFormatter进行转换,具体取决于输入的来源,你的要求.这将产生一个NSDate,这是一段时间的明确表示.在创建NSDate之后,可以对应用程序的需求进行格式化,编写,或将其转换为日期组件.