ios - 捕获当前时间但将分钟重置为零而不处理时区

标签 ios objective-c nsdate nscalendar nstimezone

在我的核心数据库中,当我从服务器更新信息时,我捕获当前时间并将其保存在核心数据库字段中。我知道服务器会在整点更新信息,所以我想将对服务器的请求速率限制为每小时一次,同时还从服务器获取最新数据。

例如,假设服务器更新其数据的时间。

在我的应用程序上,我可以随时刷新。假设我在早上 7:55 抓取了数据。虽然我想将应用程序的更新请求频率限制为每小时一次,但我也希望尽快获得最新数据。因此,我不想存储 7:55 的时间戳,而是想存储上午 7:00,这样如果我在 10 分钟后刷新,我至少会获得下一次更新。

NSDate *oldDate = [NSDate date];
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay;
NSCalendar *calendar = [NSCalendar currentCalendar];
//calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSDateComponents *comps = [calendar components:unitFlags fromDate:oldDate];
comps.minute = 00;
comps.second = 00;
NSDate *newDate = [calendar dateFromComponents:comps];

return newDate;

上面的代码不起作用,因为一旦我调用 NSCalendar,就会涉及到时区。有没有办法在不涉及 NSCalendar 的情况下做到这一点?

最佳答案

将日期/时间截断为整点必然需要指定时间 区。例如,Indian Standard Time是 GMT+05.30,所以“7.55am GMT”与“1.25pm​​ IST”相同。

如果服务器在每个完整的 GMT 小时更新其数据,则下一次更新将在“GMT 上午 8 点”。但是,如果服务器位于印度并在每个完整的 IST 小时更新其数据,则下一次更新将是“2.00pm IST”,即“7.30am GMT”。

因此,要计算“整点”,您必须知道服务器使用的时区。如果 服务器更新在每个完整的 GMT 小时完成,然后添加

calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 

会是正确的事情。

顺便说一句,计算当前小时开始时间的一种稍微更短的方法是 使用 NSCalendarrangeOfUnit:... 方法:

NSDate *oldDate = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
NSDate *newDate;
[calendar rangeOfUnit:NSHourCalendarUnit startDate:&newDate interval:NULL forDate:oldDate];
return newDate;

关于ios - 捕获当前时间但将分钟重置为零而不处理时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24256209/

相关文章:

ios - 如何让 Voiceover 拼出单词中的每个字母?

ios - Xcode复选框在哪里 "Translates Autoresizing Mask Into Constraints"

objective-c - 如何在 OS X 的屏幕上绘制 “hello world”?

objective-c - 通过循环创建一个同名的新实例

ios - NSDateFormatter,显示所有时区的相同日期

objective-c - 应用 CGAffineTransform 后从 imageview 获取新的图像尺寸

ios - 使用对象的 Swift 二维数组初始化

objective-c - 如何检测 UICollectionView 中最后一个或第一个单元格的滑动

ios - 我应该使用 NSDate 来跟踪到达时间和迟到时间吗?

ios - 在线文档中未包含 NSCalendar 的某些方法。这些可以安全使用吗?