我从 iOS 应用程序中的服务器获取以下字符串:
20140621-061250
如何将其转换为本地时间?
如何定义我的日期格式化程序?这样对吗?
dateFormatter.dateFormat = @"YYYYMMd-HHmmss";
最佳答案
这个问题并没有确切地指定转换的含义的性质,但是无论最终目标如何,您应该做的第一件事是使用正确配置的 NSDateFormatter
正确解析服务器响应。 .这需要指定正确的格式字符串,并且必须在格式化程序上显式设置时区,否则它将从本地时间推断出来,这在大多数情况下是不正确的。
指定格式字符串
让我们看看提供的输入字符串:
20140621-061250
这使用四位数字表示年份,两位数字(带零填充)表示月份,两位数字(推测这些也将被零填充)表示日期。接下来是
-
,然后两位数字代表小时,两位数字代表分钟,两位数字代表秒。引用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
,您可以根据您的应用程序要求对其进行格式化、设置样式或将其转换为日期组件。
关于cocoa - 使用 NSDateFormatter 将 UTC 转换为本地时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23564769/