gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:04:07 24 4
gpt4 key购买 nike

我从我的iOS应用中的服务器获取以下字符串:


  20140621-061250


如何将其转换为当地时间?

如何定义日期格式?它是否正确?

dateFormatter.dateFormat = @"YYYYMMd-HHmmss"; 

最佳答案

该问题并没有确切说明转换的含义,但是无论最终目标如何,您要做的第一件事就是使用正确配置的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之后,可以根据您的应用程序要求对其进行格式化,设置样式或将其转换为日期组件。

关于cocoa - 使用NSDateFormatter将UTC转换为本地时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46865553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com