在iOS中设置和检索日期可避免时区更改出现问题

时间:2014-04-29 18:26:42

标签: ios timezone nsdate

我有一个“时间跟踪”应用,允许用户在用户需要的任何日期创建一个条目,但每天只允许一个条目。我将这些条目存储到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小时)结束的日期。

当我只将时区移动几个小时或将标准时间切换为夏令时时,这似乎有效。当我从NA移动到欧洲时,它就会崩溃,即旧时区中的条目出现在检索的不同日期。

我想要获得的是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;

}

1 个答案:

答案 0 :(得分:1)

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

如果您想计算一个条目每个日历日只能在某个人所在的位置进行一次,那么您可以使用˙NSCalendar˙和˙NSDateComponents进行计算,例如时间戳表示的日期,然后从头开始当天计算24小时。转换回时间戳可为您提供有用的范围,以便检查某些日期是否在同一日历日内。 NSCalendar是计算的基础,即使您大部分时间都可能使用格里高利。使用NSDateComponents,您可以从时间戳中获得您想要的任何部分(例如,只有日期,月份,年份等)。