如何在不使用 NSCalendar 的情况下创建 NSDates(一天的开始和结束)?
Posted
技术标签:
【中文标题】如何在不使用 NSCalendar 的情况下创建 NSDates(一天的开始和结束)?【英文标题】:How to create NSDates (begin and end of day) without using NSCalendar? 【发布时间】:2013-02-01 23:26:22 【问题描述】:我有一个 iPad 应用程序,使用 XCode 4.5、ios 6.0 和 Storyboards。我需要使用 NSDate 创建一个 NSCompoundPredicate,我是由用户从 UIDatePicker 中选择的。我看到的示例显示了 NSCalendar 和 NSCalendarComponents 的使用,它们都使用“默认”日历。
这是使用一个 NSPredicate 的代码,它可以工作,但会获取该日期的所有记录以及将来的所有日期,这是错误的。
NSMutableArray *apptDataArray = [NSMutableArray new];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(aStartTime = %@)", [dict objectForKey:@"selectedDate"]];
我需要使用 NSCompoundPredicate 因为我需要获取特定日期的所有记录(从午夜后 1 分钟到所选日期的午夜)。
有没有办法从给定的 NSDate 为 NSCompoundPredicate 创建两个 NSDate(一天的开始和结束),在这种情况下:[dict objectForKey:@"selectedDate"](这是一个 NSDate)? (这个问题不是 this 的重复,它使用了上面提到的 NSCalendar 代码。)
更新:更新的问题以粗体显示。
【问题讨论】:
【参考方案1】:虽然您说您不想使用 NSCalendar
,但您已经是:
来自UIDatePicker Class Reference:
日历 用于日期选择器的日历。
@property(nonatomic, copy) NSCalendar *calendar
讨论 此属性的默认值对应于设置中配置的用户当前日历。这是等价的 调用
NSCalendar
类方法返回的值currentCalendar
。设置 calendar 为 nil 等价于设置 恢复到默认值。日历指定用于计算的文化系统的详细信息 时间;它们标识了一年的开始、长度和划分。
基本上,获取可用于查询的准确值的唯一方法是使用用于创建 NSDate 的同一日历。所以,简短的版本是:继续使用日历。其实就用这个吧:
NSCalendar *cal = [NSCalendar currentCalendar];
如果不参考日历在某些时候,您无法真正创建有意义的NSDate
对象。正如其他人指出的那样,NSDate
存储为自特定日期和时间以来的秒数。除非您想完全重写所有日历操作以考虑闰年、闰秒等,否则您应该使用 Apple 已经提供给我们的内容。
【讨论】:
【参考方案2】:NSDate
表示自固定 epoch 以来的秒数。在内部,使用的纪元是 2001 年 1 月 1 日 12:00:00AM UTC+0。跨平台的大多数 API 使用另一个纪元,即 1970 年 1 月 1 日凌晨 12:00:00 UTC+0,称为“UNIX 纪元”或“time_t
纪元”,因此也有 API 可以与该纪元相互转换。因此,日期只是一个单一的数字,类型为 NSTimeInterval
(typedef
的 double
。)
要获取一天的最初和最后时刻,您需要定义“一天”。这是通过日历完成的。大多数日历都有 24 小时的一天,但我敢肯定有一个没有。
您说您不能使用NSCalendar
,因为您需要在它不支持的日历中工作。您能告诉我们您需要使用哪个日历吗?
【讨论】:
不使用日历;日期是从 UIDatePicker 中选择的。 @spokane-dude UIDatePicker,默认为uses the[NSCalendar currentCalendar]
。所以是的,你确实有一个日历。【参考方案3】:
在我看来这是不可能的(为什么你不想使用 NSCalendar?)
【讨论】:
因为其中一个参数需要我没有的日历;我只有一个 NSDate,我需要找到属于该日期的所有记录。以上是关于如何在不使用 NSCalendar 的情况下创建 NSDates(一天的开始和结束)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 @Composable 注释的情况下为撰写函数创建扩展?
如何在不退出的情况下使用 Firebase API 创建新用户? [复制]
如何在不使用间隙的情况下使用 flex 创建间隙空间 [重复]