【问题标题】:Maximum days in a month with NSCalendarNSCalendar 一个月内的最大天数
【发布时间】:2017-01-19 19:22:11
【问题描述】:

我正在尝试创建一个日/月 UIPickerView,没有年份。目标是选择一天/一个月来列出该天/月发生的历史事件。

[NSCalendar currentCalendar]maximumRangeOfUnit:NSCalendarUnitDay]

将获得任何一个月的最大天数,即公历中的 31 天。我真正想要的是类似于

[calendar maximumRangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarMonth unit:2]

这将在公历二月返回 29。

据我所知,关闭的唯一东西有一个 forDate: 这没有帮助。一个快速的技巧是将它用于 8 年范围内的日期(以处理非闰年世纪),但这不适用于具有不同闰年规则的其他日历类型。

关于如何实现这一点的任何建议?

【问题讨论】:

  • 您能否详细介绍一下您在选择器中显示的内容以及您如何使用它?您的选择器是否显示年份以及日期和月份?
  • 如前所述,日/月,根本不显示年份,如果包含年份,则不会存在问题,因为可以使用现有的 UIDatePicker 或 forDate: 消息将解决问题。
  • @DavidKnight - 我相信他的问题是,他想要 29 年 2 月,不管他是否碰巧在 2017 年 2 月 1 日这样做,只有 28 天(因此他评论重复这个8 年,但担心这对于非公历可能还不够)。

标签: ios objective-c cocoa nscalendar


【解决方案1】:

NSCalendar 不直接提供您要求的功能。既然你想支持其他日历,你最好的选择确实是循环多个时代/年/月组合,调用-[NSCalendar rangeOfUnit:inUnit:forDate:]。八年是不够的,因为(例如)希伯来历是(我相信)一个 19 年的周期。

Also note that other calendars (e.g. the Chinese calendar) have more than just the two eras (BCE/CE) of the Gregorian calendar,所以你应该改变时代以及年份和月份。

如果这很昂贵,您可以编写一个命令行程序来执行此操作并为您嵌入到应用程序中的表发出源代码。然后,您可以将程序作为预编译构建步骤运行。

如果您有权访问历史事件数据库,另一种方法是查找数据库中实际使用的每个日期,并确保您的范围涵盖这些日期。

【讨论】:

  • 如果可能,我想支持非公历,因此问题。
  • 是的,八只是格里高利的一个例子。您的预编译建议看起来像是前进的方向。
猜你喜欢
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2019-01-20
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多