如何在不使用 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 可以与该纪元相互转换。因此,日期只是一个单一的数字,类型为 NSTimeIntervaltypedefdouble。)

要获取一天的最初和最后时刻,您需要定义“一天”。这是通过日历完成的。大多数日历都有 24 小时的一天,但我敢肯定有一个没有。

您说您不能使用NSCalendar,因为您需要在它不支持的日历中工作。您能告诉我们您需要使用哪个日历吗?

【讨论】:

不使用日历;日期是从 UIDatePicker 中选择的。 @spokane-dude UIDatePicker,默认为uses the [NSCalendar currentCalendar]。所以是的,你确实有一个日历。【参考方案3】:

在我看来这是不可能的(为什么你不想使用 NSCalendar?)

【讨论】:

因为其中一个参数需要我没有的日历;我只有一个 NSDate,我需要找到属于该日期的所有记录。

以上是关于如何在不使用 NSCalendar 的情况下创建 NSDates(一天的开始和结束)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 @Composable 注释的情况下为撰写函数创建扩展?

如何在不创建父目录的情况下使用 wget 镜像目录?

如何在不退出的情况下使用 Firebase API 创建新用户? [复制]

如何在不使用间隙的情况下使用 flex 创建间隙空间 [重复]

如何在不使用 TableViewController 的情况下创建分组的 TableView

如何在不使用 boost 的情况下创建目录?