【发布时间】:2014-03-15 19:38:50
【问题描述】:
2 个月前,我在 App Store 上发布了我的第一个应用程序,到目前为止,我的成功非常好。然而,我最近发现了一个问题。
该应用程序的前提是能够跟踪发送和接收的钱信封。这是一个简单的应用程序,允许您添加条目,然后在选项卡栏中,它显示按时间顺序排列的时间线,然后在其他选项卡中仅按名称、事件和年份进行过滤。它在世界各地都很好用,除非您更改时区。
应用程序在后台使用核心数据,包括一些 NSPredicate 检查以查看“如果您选择的今年已经存在,我将返回它,如果不存在,我将为该年创建一个新条目”。因此,如果您有一个 2014 年和一个 2013 年作为年份的条目,在“年份”选项卡中,您将看到一个 2014 年的条目和一个 2013 年的条目。如果您添加另一个 2014 年的条目,您将不会在“年份”选项卡中看到两个 2014 年的条目年选项卡,但仍然是一个 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 点。
我希望这是有道理的,但我们将不胜感激。
谢谢,
【问题讨论】:
-
通常我使用带有 GMT 时区的 dateFormatter 来解析日期字符串,并使用零时区发送/接收日期字符串(例如 @"01/01/2014 +000")。
NSDateFormatter * dateFormatter = [NSDateFormater new]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT: 0]]。不确定该解决方案是否正确,但可以满足我的需求 -
亲爱的 Mykola - 非常感谢您的回复,这是有道理的 - 我使用 Martin 的回答来完成这项工作,但我也理解您的方法 - 不胜感激!
标签: ios date core-data timezone nspredicate