【问题标题】:Storing an absolute NSDate, not relative to a timezone存储绝对 NSDate,而不是相对于时区
【发布时间】:2012-11-04 03:47:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • @scoota 你能成功实现这个吗?即使我面临同样的问题。

标签: objective-c ios nsdate nscalendar nstimezone


【解决方案1】:

您是否尝试过将时间转换为它的 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 时区的相同。

【讨论】:

  • 您好 Abizern,我的时区有问题,我正在创建一个日期为 1-06-2014,00:00:01,现在我得到了月份和年份,但我得到了月份5 年和 2014 年,这只发生在美国时区
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2013-05-10
    • 2011-10-17
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多