6

我正在创建一个 iOS 应用程序来跟踪出勤率。每个考勤条目都存储在一个对象中,该对象具有一个状态属性(例如,出席、缺席)和一个NSDate被调用的属性,该属性date表示该考勤记录被记录的日期。当我选择特定日期(使用 aUIDatePickerView或类似名称)时,我希望该日期的所有出勤记录(对象)显示在表格视图中。

虽然这在原则上听起来很简单,但我遇到了一个与时区有关的问题。我知道NSDates 的存储独立于时区(即它们相对于 UTC/GMT +0000 存储)。这意味着,如果我在悉尼并在例如 2012 年 11 月 4 日星期日出勤,因为日期存储为独立于时区,如果我将 iPhone/iPad 带到不同的时区(例如旧金山),所有出勤记录会向后移动一天,在这种情况下是 2012 年 11 月 3 日星期六,因为那是在旧金山当地时间(实际上是悉尼当地时间的第二天)进行考勤的时间。

我不希望这种情况发生——我希望日期是绝对的。换句话说,如果出席时间是 2012 年 11 月 4 日星期日,那么无论我去世界上的哪个地方(以及哪个时区),都需要保持在那个日期。如您所见,这与日历应用程序形成鲜明对比,日历应用程序需要根据时区更改约会时间。

任何有关解决此问题的更好方法的建议将不胜感激。请记住,我正在使用 a 选择要显示的日期,UIDatePickerView它以与时区无关的格式返回当前值NSDate,因此我还需要一种方法来进行简单的比较(最好是在 an 中,NSPredicate因为出勤对象存储在 Core Data 中)获取该特定日期的所有出勤对象。

4

2 回答 2

6

您是否尝试过将时间转换为它的 NSDateComponents?然后,无论时区如何,您都可以从中重新创建 NSDate。

编辑添加

// This is just so I can create a date from a string.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];


// Create a date as recorded in a timezone that isn't mine.
NSDate *localDate = [formatter dateFromString:@"2012-10-30 10:30:00 +0200"];
NSLog(@"Initial Date: %@", localDate);
// this logs 2012-10-30 08:30:00 +0000
// Which is what you would expect, as the original time was 2 hours ahead

NSDateComponents *components = [[NSDateComponents alloc] init];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
components = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit fromDate:localDate];

NSLog(@"Components: %@", components);


// Create a date from these time components in some other time zone
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
NSDate *newDate = [gregorian dateFromComponents:components];

NSLog(@"New Date: %@", newDate);
// This logs 2012-10-30 12:30:00 +0000
// Which is the local EST of 8:30 am expressed in UTC

这演示了我如何使 +2 时区的上午 8:30 看起来与 -4 时区的相同。

于 2012-11-04T03:56:08.687 回答
1

我相信对您来说更好的方法是使用时间戳,因为它独立于任何时区。您可以使用不同的方法将时间戳转换为日期并返回。并实现您希望的任何逻辑。

您也可以轻松地比较它们。

于 2012-11-04T05:37:27.507 回答