我有一个"time-tracking"应用程序,允许用户在用户想要的任何日期创建条目,但每天只允许创建一个条目。我将这些条目存储到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小时)的日期。
当我只将时区转换几个小时或将标准时间切换到Daylight Savings时,这种攻击似乎是有效的。当我从NA搬到欧洲时,它就分崩离析了,即旧时区的条目在检索过程中出现在不同的日子。
我想要得到的是2014年4月25日的一个条目,无论我目前在哪个时区,都会在2014年4月25日出现。
我已经看过许多可以理解NSDate、NSDateComponents、NSCalendar等的资源,但似乎无法很好地理解它,这将使我能够正确或干净地实现这一点。任何建议都很感激。
下面是我的方法,用于创建一个特定时间的日期(在一天中)。
+ (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;}
发布于 2014-04-29 19:27:06
使用时区和平台无关的最佳方法是时间戳,您也可以从NSDate获得时间戳。有了它,你可以很容易地用时间间隔进行计算。如果您希望有一个特定的日期,它总是与用户的时区相关。然后,您可以将时间戳转换为用户格式化的日期。就像Zaph提到的,他可能想看看他现在的日期。同样,使用时间戳,这始终是可靠的。
如果要计算某人所在位置的每个日历日只能执行一次条目,则可以使用·NSCalendar·和·NSDateComponents·计算,例如时间戳代表的日期,然后从当天开始计算24小时。转换回时间戳为您提供了一个有用的范围,用于检查某物是否在同一日历日内。NSCalendar是计算的基础,即使您可能大部分时间都会使用Gregorian。有了NSDateComponents,你可以从你的时间戳中分离出你想要的任何东西(例如,只有一天、一个月、一个年份等等)。
https://stackoverflow.com/questions/23372470
复制相似问题