在iOS中设置和检索日期,以避免时区更改问题



我有一个"时间跟踪">应用程序,允许用户在用户希望的任何一天创建条目,但每天只允许创建一个条目。我将这些条目存储到CoreData中。

[rateObject setValue:[Day dateWithHour:currentDate forHour:12] forKey:@"date"];

稍后,我将使用以下代码检索这些条目。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Day"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]];
request.predicate = [NSPredicate predicateWithFormat:@"whoWorked == %@ && date => %@ && date =< %@", whoWorked, [Day dateWithHour:fromDate forHour:0], [Day dateWithHour:toDate forHour:24]];

如您所见,我将条目放在中午(12小时(,并检索从第一天开始(0小时(到最后一天结束(24小时(的日期。

当我只将时区移动几个小时或将Standard Time切换到夏令时时,这是一个似乎有效的破解方法。当我从北美搬到欧洲时,它就崩溃了,即旧时区中的条目出现在检索的不同日期。

我想得到的是2014年4月25日的条目,无论我当前所在的时区,都会出现在2014年4月份25日。

我已经查看了许多来源来理解NSDateNSDateComponentsNSCalendar等,但似乎无法很好地理解,从而使我能够正确或干净地实现这一点。如有任何建议,不胜感激。

以下是我创建具有特定小时(以天为单位(的日期的方法。

+ (NSDate *)dateWithHour:(NSDate *)date forHour:(int)hour {
// Create and initialize date component instance
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit fromDate:date];
if (hour<0) hour = 0;
else if (hour>24) hour = 24;
[dateComponents setHour:hour];
// Create period dates
NSDate *newDate = [[NSCalendar currentCalendar] dateFromComponents:dateComponents];
return newDate;

}

最好使用独立于时区和平台的时间戳,您也可以从NSDate中获取时间戳。有了它,您可以轻松地使用时间间隔进行计算。如果你想有一个特定的日期,它总是与用户的时区相关。然后,您可以将时间戳转换为用户格式的日期。就像Zaph提到的那样,他可能想看看他现在所在的日期。同样,有了时间戳,这总是可靠的。

如果你想计算一个条目在某人所在的地点每个日历日只能完成一次,那么你可以使用*NSCalendar**和*NSDateComponents**计算,例如时间戳代表哪一天,然后从当天开始计算24小时。转换回时间戳可以为您提供一个有用的范围,用于检查某个内容是否在同一日历日内。NSCalendar是计算的基础,即使你可能大部分时间都使用格里高利。有了NSDateComponents,你可以从时间戳中选择你想要的任何部分(例如,只有天、月、年等(。

相关内容

  • 没有找到相关文章

最新更新