iOS App 不同的时区处理不同的日期条目

标签 ios date core-data timezone nspredicate

我在 2 个月前在 App Store 发布了我的第一个应用程序,迄今为止取得了巨大的成功。然而,我最近发现了一个问题。

该应用程序的前提是能够跟踪提供和接收的钱袋。这是一个简单的应用程序,允许您添加条目,然后在选项卡栏中显示按时间顺序排列的时间线,然后在其他选项卡中仅按名称、事件和年份进行过滤。它适用于世界各地,除非您更改时区。

该应用程序在后台使用核心数据,包括一些 NSPredicate 检查以查看“如果您选择的今年已经存在,我将返回它,如果不存在,我将创建一个年的新条目”。因此,如果您有一个条目以 2014 年和一个以 2013 年作为年份,则在“年份”选项卡中,您将看到一个 2014 年的条目和一个 2013 年的条目。如果您添加另一个 2014 年的条目,您将不会在“年份”选项卡中看到两个 2014 年的条目year 选项卡,但仍然是 2014 年的单个条目(包含以下所有交易)。

使用 UIDatePicker 选择日期以获得实际日期。

当您更改时区时会出现问题。如果你这样做,一个以 2014 年为年份的条目将不再被识别为与之前的 2014 年相同的条目,因此在年份选项卡中,我最终得到多个 2014 年的条目,这当然没有意义。

我发现这与计时有关,您可以在下面看到我没有使用时区,而是使用了 NSGregorianCalendar 功能。

NSCalendar *yearCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *yearComponent = [yearCal components:NSYearCalendarUnit fromDate:self.datePicker.date];
NSDate *selectedYear = [yearCal dateFromComponents:yearComponent];

在不过多更改应用程序功能的情况下(我希望它以相同的方式工作),我将如何指定 GMT 时区,但由于夏令时等原因,我想保留它以格林威治标准时间中午 12 点为标准,因此无论您身在世界何处,时间都会集中在格林威治标准时间中午 12 点。

我希望这是有道理的,但我们将不胜感激。

谢谢,

最佳答案

时区处理起来非常棘手。您始终必须考虑日期属性的语义(例如,如果 2014 年在澳大利亚输入的值应显示为“2014 年”或“2013 年”,因为“home timezone' 在美国,那是 2013 年等等)

NSCalendar 默认使用当前本地时区,UIDatePicker(和 NSTimeFormatter,在调试器中执行 po date 时内部使用)也是如此。 我的第一个建议是,如果您想基于年份进行过滤,请将年份作为单独的字段存储在数据库中。

但如果您想将日期值“规范化”到特定时区,您可以在 NSDateComponents 上设置 UTC 时区,以获取 UTC 中的一年中的第一时刻:

NSCalendar *yearCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *yearComponent = [yearCal components:NSYearCalendarUnit fromDate:self.datePicker.date];
[yearComponent setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]
NSDate *selectedYear = [yearCal dateFromComponents:yearComponent];

这会覆盖 NSCalendar 自己的 timeZone 属性(应该与 UIDatePicker 的相同)。

关于iOS App 不同的时区处理不同的日期条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21813318/

相关文章:

ios - 动态添加自定义 UITableViewCell

php - swift3 - 将图像上传到网络服务器

iphone - 我应该在哪里将 iPhone View 中的 "save"更改为对象的 'create new'?

ios - CoreData Fetch 从 Double 创建 String

ios - NSCoreData 条目获取的性能

ios - 如何在 Xcode 中向 OpenGL ES 帧捕获数据添加注释?

iphone - 即使选择器存在,UIButton选择器也会抛出“无法识别的选择器”

来自字符串的 Java 星期几

java - 如何格式化 struts 2 select 标签中的日期列表?

python - 应创建文件时未找到文件错误(仅当我将当前日期添加到名称中时)