NSCalendar + NSDateComponents
- 历法能使人类确定每一日再无限的时间中的确切位置并记录历史。
- 日历,历法,一般历法都是遵循固定的规则的,具有周期性。日历都是已知的或可预测的。
- 任何一种具体的历法,首先必须明确规定起始点,即开始计算的年代,这叫“纪元”;以及规定一年的开端,这叫“岁首”。此外,还要规定每年所含的日数,如何划分月份,每月有多少天等等。
- NSCalendar对世界上现存的常用的历法进行了封装,既提供了不同历法的时间信息,又支持日历的计算。
-
NSDateFomatter表示的时间默认以公历(即阳历)为参考,可以通过设置calendar属性变量获得特定历法下的时间表示。
-
NSDate是独立与任何历法的,它只是时间相对于某个时间点的时间差;NSDate是进行日历计算的基础。
- NSDateComponents将时间表示成适合人类阅读和使用的方式,通过NSDateComponents可以快速而简单地获取某个时间 点对应的“年”,“月”,“日”,“时”,“分”,“秒”,“周”等信息。当然一旦涉及了年月日时分秒就要和某个历法绑定,因此 NSDateComponents必须和NSCalendar一起使用,默认为公历。
- NSDateComponents除了像上面说的表示一个时间点外,还可以表示时间段,例如:两周,三个月,20年,7天,10分钟,50秒等等。时间段用于日历的计算,例如:获取当前历法下,三个月前的某个时间点。
- 可以说,要获取某个时间点在某个历法下的表示,需要NSDateComponents;要计算当前时间点在某个历法下对应的一个时间段前或后的时间点,需要NSDateComponents。
- NSDateComponents返回的day, week, weekday, month, year这一类数据都是从1开始的。因为日历是给人看的,不是给计算机看的,从0开始就是个错误。
NSDateComponents实例化的方式
第一种:
02 |
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; |
04 |
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]]; |
05 |
NSLog(@ "year(年份): %i" , dateComponents.year);
|
06 |
NSLog(@ "quarter(季度):%i" , dateComponents.quarter);
|
07 |
NSLog(@ "month(月份):%i" , dateComponents.month);
|
08 |
NSLog(@ "day(日期):%i" , dateComponents.day);
|
09 |
NSLog(@ "hour(小时):%i" , dateComponents.hour);
|
10 |
NSLog(@ "minute(分钟):%i" , dateComponents.minute);
|
11 |
NSLog(@ "second(秒):%i" , dateComponents.second);
|
14 |
NSLog(@ "weekday(星期):%i" , dateComponents.weekday);
|
17 |
NSLog(@ "week(该年第几周):%i" , dateComponents.week);
|
18 |
NSLog(@ "weekOfYear(该年第几周):%i" , dateComponents.weekOfYear);
|
19 |
NSLog(@ "weekOfMonth(该月第几周):%i" , dateComponents.weekOfMonth);
|
若获取dateComponents对象时,设置components的时候未添加 NSYearCalendarUnit,dateComponents.year将返回错误的数值,其他的也一样,所以使用 NSDateComponents表示时间时,要确保需要使用的数据都在componets中添加了。
第二种:
02 |
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; |
05 |
NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init]; |
06 |
[dateComponentsForDate setDay:6]; |
07 |
[dateComponentsForDate setMonth:5]; |
08 |
[dateComponentsForDate setYear:2004]; |
12 |
NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc]; |
18 |
NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init]; |
19 |
[dateComponentsForDate setDay:6]; |
22 |
NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0]; |
第三种:
2 |
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; |
5 |
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0]; |
6 |
NSLog(@ "number of years:%i" , dateComponents.year);
|
NSCalendar中比较重要的方法和概念
firstWeekday
firstWeekday是大家比较容易浑淆的东西。
大家在使用dateComponents.weekday获取某天对应的星期时,会发现,星期日对应的值为1,星期一对应的值为2,星期二对应的值 为3,依次递推,星期六对应的值为7,这与我们平时理解的方式不一样。然后,我们就开始找是不是可以设置这种对应关系。终于,我们在NSCalendar 中发现了firstWeekday这个变量,从字面意思上看貌似就是我们寻找的那个东西。可是,设置过firstWeekday后,我们又发现完全没有作 用,真是郁闷啊!其实,大家不必郁闷,因为郁闷也没用,iOS中规定的就是周日为1,周一为2,周二为3,周三为4,周四为5,周五为6,周六为7,无法 通过某个设置改变这个事实的,只能在使用的时候注意一下这个规则了。那firstWeekday是干什么用的呢?大家设置一下firstWeekday, 再获取一下dateComponents.weekOfYear或dateComponents.weekOfMonth,看看返回的数据是否发生了变 化。firstWeekday的作用确实是修改当前历法中周的起始位置,但是不能修改周日对应的数值,只能修改一年或一个月中周的数量,以及周的次序。
-(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
答疑解惑:
-
Unit:单元
-
NSRange:
typedef struct _NSRange {
} NSRange;
我们大致可以理解为:某个时间点所在的“小单元”,在“大单元”中的数量(返回值range的location属性变量的值一般是错误的)。例如:
2 |
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
|
4 |
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
|
-(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
我们大致可以理解为:某个时间点所在的“小单元”,在“大单元”中的位置(从1开始)。例如:
2 |
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self];
|
3 |
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]];
|
6 |
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self];
|
7 |
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
|
在这里:NSWeekOfYearCalendarUnit, NSWeekOfMonthCalendarUnit与NSWeekCalendarUnit的使用结果相同,为了避免浑淆,建议在此处使用 NSWeekCalendar,而定义NSDateComponents时使用NSWeekOfYearCalendarUnit和 NSWeekOfMonthCalendarUnit。
-(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval )tip forDate:(NSDate *)date;
我们大致可以理解为:“某个时间点”所在的“单元”的起始时间,以及起始时间距离“某个时间点”的时差(单位秒)。例如:
01 |
NSDate *startDateOfYear; |
02 |
NSDate *startDateOfMonth;
|
03 |
NSDate *startDateOfWeek;
|
04 |
NSDate *startDateOfDay;
|
05 |
NSTimeInterval TIOfYear;
|
06 |
NSTimeInterval TIOfMonth;
|
07 |
NSTimeInterval TIOfWeek;
|
08 |
NSTimeInterval TIOfDay;
|
09 |
[[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDateOfYear interval:&TIOfYear forDate:[NSDate date]];
|
10 |
[[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startDateOfMonth interval:&TIOfMonth forDate:[NSDate date]];
|
11 |
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startDateOfWeek interval:&TIOfWeek forDate:[NSDate date]];
|
12 |
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startDateOfDay interval:&TIOfDay forDate:[NSDate date]];
|
13 |
NSLog(@ "firstDateOfYear:%@, FirstDateOfMonth:%@, FirstDateOfWeek:%@, FirstDateOfDay:%@" , startDateOfYear, startDateOfMonth, startDateOfWeek, startDateOfDay);
|
14 |
NSLog(@ "TIOfYear:%f, TIOfMonth:%f, TIOfWeek:%f, TIOfDay:%f" , TIOfYear, TIOfMonth, TIOfWeek, TIOfDay);
|
分享到:
相关推荐
在iOS开发中,`NSCalendar`是苹果提供的一个核心框架类,用于处理日期和时间的计算,特别是与日历相关的操作。本项目“ios-NSCalendar日历功能,万年历.zip”提供了一个使用Objective-C(OC)编写的自定义万年历的...
总结起来,iOS开发中处理时间间隔和计算距离当前的天数主要依赖于NSDate、NSCalendar和NSDateComponents。通过这些工具,开发者可以轻松地进行日期和时间的比较、转换和计算,从而满足各种应用程序的需求。无论是在...
`JFDate` 针对`NSDate`进行了扩展,提供了丰富的API,使得进行年月日时分秒的加减运算变得非常简单。在日常开发中,我们常常需要计算两个日期之间的差值,例如用户生日和当前日期的差距,或者确定一个事件距离现在有...
在iOS开发中,时间戳与NSDate对象之间的转换是常见的任务,因为时间戳是无格式的数字,便于存储和计算,而NSDate是Objective-C中的日期类,用于表示特定时刻。本项目"iOS时间戳字符串NSDate转化demo"提供了一个示例...
倒计时功能是iOS应用中常见的需求,比如60秒倒计时、天数倒计时。在Swift中,你可以使用`Timer`配合`DispatchSourceTimer`来实现倒计时。例如,60秒倒计时的简单实现: ```swift var remainingSeconds = 60 let ...
在iOS和macOS开发中,`NSDate`是Objective-C中的一个核心类,用于表示时间的绝对值,即自1970年1月1日(UTC)以来的秒数。这个时间戳通常被称为Unix时间戳。`NSDate`是Foundation框架的一部分,与Swift中的`Date`类...
3. **转换日期**:使用扩展的`NSDate`方法或者自定义的`NSCalendar`方法进行转换,例如`NSDate *lunarDate = [gregorianDate convertToLunarDate];`。 4. **显示结果**:根据需求,你可能需要将农历日期转换为字符...
首先,我们需要了解iOS中处理日期的基本类——NSDate、NSCalendar、NSDateComponents等。NSDate是苹果提供的一个抽象类,代表了绝对时间,而NSCalendar则用于处理日历相关的计算,如日期的加减、比较等。...
在iOS开发中,`NSCalendar`是Foundation框架的一部分,用于处理日期和时间的计算与转换。它是Apple的Cocoa框架中的一个核心组件,主要用于处理日期的分隔、比较和组合。`NSCalendar`对象允许开发者根据特定的日历...
总的来说,通过合理利用`NSCalendar`(或`Calendar`)和`DateComponents`,我们可以轻松地在iOS应用中实现判断两个日期是否在同一周的功能。这不仅提高了代码的可读性和可维护性,还能确保在各种复杂情况下得到准确...
iOS提供了NSDate、NSCalendar和NSFormatter等类来处理日期和时间。开发者需要将用户输入的日期转化为NSDate对象,然后使用NSCalendar来计算对应的星座。这通常需要根据黄道十二宫的日期范围进行比较。 "输入首字母...
在代码中,我们会用到`NSCalendar`、`NSDateComponents`以及`NSDate`等类。 `NSCalendar`是用于处理日期和时间的历法类,可以用来获取日期的各种组成部分。在示例代码中,我们创建了一个`NSCalendar`实例,选择了...
3. **Foundation框架**:在iOS开发中,Foundation框架提供了基本的数据类型和数据结构,如NSDate、NSCalendar等,这些都是处理日期和时间的基础。DateToHoliday-iOS项目会用到这些类来操作日期。 4. **NSCalendar...
系统的时间获取通常依赖于 NSDate、NSCalendar 和 NSDateComponents 等类。开发者需要设置定时器(NSTimer)来定期更新界面,展示当前时间。此外,考虑到性能优化,他们可能还会研究如何使用CADisplayLink来更精确地...
在iOS和macOS开发中,`NSDate`是Apple的Foundation框架中的一个核心类,用于表示绝对时间,即自1970年1月1日(UTC)以来的秒数。这个时间戳通常被称为Unix时间戳。`NSDate`对象不包含任何时区或日历信息,它仅表示一...
这需要应用具备日期和时间处理能力,例如使用Foundation框架中的NSDate和NSCalendar类来处理日期计算,以及NSNotification或UserNotifications框架来实现提醒功能。用户设定的提醒会与系统日历同步,确保在指定时间...
- 日期与时间:使用NSDate、NSCalendar、NSTimeInterval等处理日期和时间。 - 错误处理:理解NSError对象及其在异常情况下的应用。 4. iOS开发实战: - 视图与控制器:学习UIView、UIViewController及其子类的...
在iOS中,我们主要使用Foundation框架中的`NSDate`、`NSCalendar`、`NSDateComponents`和`NSDateFormatter`类来处理日期和时间。`NSDate`是表示绝对时间的类,它代表的是自纪元以来的秒数。而`NSCalendar`用于定义...
NSDateComponents *components2 = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; NSInteger currentDateYear = [components...
在iOS中,苹果提供了Foundation框架,其中的NSDate、NSCalendar、NSDateComponents等类是处理日期和时间的核心工具。例如,我们可以使用NSCalendar的`components:fromDate:`方法从一个日期中提取年、月、日等信息。 ...