gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:15:34 26 4
gpt4 key购买 nike

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

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