【问题标题】:Date/Time parsing in iOS: how to deal (or not deal) with timezones?iOS 中的日期/时间解析:如何处理(或不处理)时区?
【发布时间】:2011-04-05 23:44:06
【问题描述】:

我有一个 ASP.NET MVC 3 网站,它通过 JSON 与我的 iOS 应用程序通信。作为 JSON 响应中发送的对象的一部分,我有yyyy-MM-dd HH:mm:ss ZZZ 格式的日期,它输出2011-04-05 16:28:22 -07:00。我如何在 iOS 中解析它?

这是我现在正在搞乱的代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSDate *date = [dateFormatter dateFromString:@"2011-04-05T16:28:22-0700"];

NSLog(@"%@; %@; %@", dateFormatter, date, [NSTimeZone localTimeZone]);

首先要注意的是2011-04-05 16:28:22 -07:00 必须看起来像2011-04-05T16:28:22-0700,其中T 替换第一个空格(假设代表时间,或者字符串的时间部分从哪里开始?),删除第二个空格并删除时区中的冒号。我想我会找到一种方法来格式化 .NET 发回的字符串以符合 iOS 将解析的字符串。

真正的问题是输出的日期比我在 JSON 响应中发送的日期早 7 小时。因此,iOS 将2011-04-05 16:28:22 -07:00 输出为2011-04-05 23:28:22 +0000,就我的应用而言,这是错误的。

到目前为止,我发现的唯一解决方案是将 JSON 中的日期发送为 2011-04-05 16:28:22 +00:00,但这又是错误的,因为我正在更改实际日期。

无论如何,我很感激有人看一看并告诉我如何解析 .NET 通过格式输出的日期字符串 yyyy-MM-dd HH:mm:ss ZZZ(我想可以将其重写为 yyyy-MM-ddTHH:mm:ssZZZ)到NSDate 可以在 iOS 中使用的对象。

【问题讨论】:

  • 说到iOS输出,是指NSLog吗?如果是这样,NSLog 总是默认输出 GMT。所以,你的代码没有问题。
  • 是的,这就是我所指的。但是,如果NSLog 在 GMT 中输出,那么 UILabel 输出是什么意思?
  • NSDate 将时间存储为 GMT。将任何日期显示为字符串时,您必须使用NSDateFormatter -stringFromDate 方法。 NSDateFormatter 也默认为当前时区。
  • 还可以考虑按照Apple Technical Q&A 1480 中的建议设置locale

标签: objective-c ios nsdate nsdateformatter


【解决方案1】:

我不知道这有多正确,但我最终发现在 .NET 中我必须这样做 DateTime.ToUniversalTime().ToString("yyyy-MM-ddHH:mm:ss") 而在 iOS 端我必须这样做:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"];
NSDate *date = [dateFormatter dateFromString:@"2011-04-0600:28:27"];

只有这样NSLog 输出的日期才是正确的,所以我假设我终于得到了正确的日期/时间。

【讨论】:

    【解决方案2】:

    您的 iOS 日期解析代码是正确的:2011-04-05 16:28:22 -07:002011-04-05 23:28:22 +0000 代表相同的时间,只是在不同的时区。您唯一的问题是 NSDate 实际上并不存储时区,因此 [date description] 使用 UTC 输出。

    【讨论】:

      【解决方案3】:

      几乎可以肯定,您最好在任何地方都使用 UTC 时间进行交换,而不用担心时区。我相信您可以让您的 ASP.NET 代码执行此操作,并且在接收端也更容易解析。 NSDateFormatter 使用标准 Unicode 日期格式化语法,您可以阅读有关 here 的信息。

      【讨论】:

      • 我明白了,我已将 .NET 端更改为通用时间输出,但我不确定如何在 iOS 端解析字符串。这是 JSON 响应:{"Start":"\/Date(1302048496487)\/","End":"\/Date(1302055696487)\/"}。解析它的正确代码是什么?
      • 不幸的是,忽略时区虽然对计算机很好,但对人类来说并不“完全正确”。夏令时等,使这更加麻烦:(
      • 我不是说一般情况,我是指在服务器上。相信我,我写了一个闹钟应用程序,并且花了太多时间处理时区和表单设置。 :-)
      • @NicholasRiley 只是让你保持警惕 ;-)(我目前正处于一场我认为不会赢的时区之战......)
      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2011-07-13
      • 2022-11-18
      相关资源
      最近更新 更多