cocoa - 使用 NSDateFormatter 将 UTC 转换为本地时间

标签 cocoa cocoa-touch time nsdateformatter date-parsing

我从 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/

相关文章:

Javascript 时间戳到相对时间

iphone - 我在哪里可以找到关于 iPhone/Objective-C 多线程的好教程?

iphone - 检测硬件类型、iPhone 4 或 iPhone 5 的最佳方法?

iphone - View Controller 的全局实例是否应该由应用程序委托(delegate)拥有

objective-c - 将时间转换为 float

javascript - 移除 HTML5 输入类型 ="time"出现的箭头

swift - NSTableView排序小数列导致异常

cocoa - 以编程方式确定事件应用程序的 .icns 文件 (OS X)

objective-c - NSDate 计算夏令时

ios - 我的 UIView 有一个 UIButton 作为它的 subview 之一,但不响应 Objective-C 中的事件