对日期和时间的处理 NSCalendar
代码较老,供参考
NSCalendar用于处理时间相关问题。比如比较时间前后、计算日期所的周别等。
1. 创建或初始化可用以下方法
+ (id)currentCalendar;
取得当前用户的逻辑日历(logical calendar)
+ (id)autoupdatingCurrentCalendar;
取得当前用户的逻辑日历(logical calendar), ......
- (id)initWithCalendarIdentifier:(NSString *)identifier;
初始化为各种日历。identifier的范围可以是:
NSGregorianCalendar 阳历
NSBuddhistCalendar 佛历
NSChineseCalendar 中国日历
NSHebrewCalendar 希伯来日历
NSIslamicCalendar 伊斯兰日历
NSIslamicCivilCalendar 伊斯兰民事日历
NSJapaneseCalendar 日本日历
2. 使用前若有必要可以先做以下设定
- (void)setLocale:(NSLocale *)locale;
设置区域
- (void)setTimeZone:(NSTimeZone *)tz;
设置时区
- (void)setFirstWeekday:(NSUInteger)value;
设定每周的第一天从星期几开始,比如:
. 如需设定从星期日开始,则value传入1
. 如需设定从星期一开始,则value传入2
. 以此类推
详细信息请参阅FirstWeekday属性
- (void)setMinimumDaysInFirstWeek:(NSUInteger)value;
设定作为(每年及每月)第一周必须包含的最少天数,比如:
. 如需设定第一周最少包括7天,则value传入7
详细信息请参阅MinimumDaysInFirstWeek属性
3. 取回设定信息用以下方法
- (NSString *)calendarIdentifier
返回日历标示符(identifier)。有效的日历标示符包括:
NSGregorianCalendar
NSBuddhistCalendar
NSChineseCalendar
NSHebrewCalendar
NSIslamicCalendar
NSIslamicCivilCalendar
NSJapaneseCalendar
- (NSLocale *)locale;
返回日历指定的地区信息。它将影响???
- (NSTimeZone *)timeZone;
返回日历指定的时区信息。它将影响???
- (NSUInteger)firstWeekday;
返回日历指定的每周的第一天从星期几开始。缺省为星期天,即firstWeekday = 1
当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit参数为NSWeekdayCalendarUnit,inUnit参数为NSWeekCalendarUnit时,
firstWeekday属性影响它的返回值。具体说明如下:
. 当firstWeekday被指定为星期天(即 = 1)时,它返回的值与星期几对应的数值保持一致。比如:
fromDate传入的参数是星期日,则函数返回1
fromDate传入的参数是星期一,则函数返回2
. 当firstWeekday被指定为其它值时(即 <> 1)时,假设firstWeekday被指定为星期一(即 = 2),那么:
fromDate传入的参数是星期一,则函数返回1
fromDate传入的参数是星期二,则函数返回2
fromDate传入的参数是星期日,则函数返回7
- (NSUInteger)minimumDaysInFirstWeek;
返回日历指定的第一周必须包含的最少天数。缺省为1,即minimumDaysInFirstWeek = 1。
当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit参数为NSWeekCalendarUnit,inUnit参数为NSYearCalendarUnit时,
minimumDaysInFirstWeek属性影响它的返回值。具体说明如下:
2005年1月
日 一 二 三 四 五 六
--------------------------------
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
2005年1月第一周包括1号。
a. 如果将minimumDaysInFirstWeek设定 = 1
则fromDate传入1月1号,方法均返回1 ==> 满足minimumDaysInFirstWeek指定的天数(最少1天),所以方法将其归为2005年的第1周
则fromDate传入1月2-8号,方法均返回2
则fromDate传入1月9-15号,方法均返回3
......
b. 如果将minimumDaysInFirstWeek设定为 > 1,比如2
则fromDate传入1月1号,方法均返回53 ==> 不足2天,所以方法将其归为2004年的第53周
则fromDate传入1月2-8号,方法均返回1
则fromDate传入1月9-15号,方法均返回2
......
2008年1月
日 一 二 三 四 五 六
---------------------------------
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
2005年1月第一周包括1-5号共5天。
a. 如果将minimumDaysInFirstWeek设定为 <= 5时
则fromDate传入1月1-5号,方法均返回1 ==> 满足minimumDaysInFirstWeek指定的天数,所以方法将其归为2008年的第1周
则fromDate传入1月6-12号,方法均返回2
则fromDate传入1月13-19号,方法均返回3
......
b. 如果将minimumDaysInFirstWeek设定为 > 5,比如6
则fromDate传入1月1-5号,方法均返回53 ==> 当周不足6天,所以方法将其归为2007年的第53周
则fromDate传入1月2-8号,方法均返回1
则fromDate传入1月9-15号,方法均返回2
......
当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit参数为NSWeekCalendarUnit,inUnit参数为NSMonthCalendarUnit时,
minimumDaysInFirstWeek属性影响它的返回值。以2008年4月为例, 具体说明如下:
2008年4月
日 一 二 三 四 五 六
---------------------------------
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
2008年4月第一周包括1、2、3、4、5号。
1. 如果将minimumDaysInFirstWeek设定为小于或等于5的数
则fromDate传入4月1-5号,方法均返回1
则fromDate传入4月6-12号,方法均返回2
则fromDate传入4月13-19号,方法均返回3
....
2. 如果将minimumDaysInFirstWeek设定为大于5的数
则fromDate传入1-5号,方法均返回0
则fromDate传入6-12号,方法均返回1
则fromDate传入13-19号,方法均返回2
....
其他方法的说明
- (NSRange)maximumRangeOfUnit:(NSCalendarUnit)unit;
返回单元的最大范围。就Gregorian来说有:
NSEraCalendarUnit => 0 - 2
NSYearCalendarUnit => 1 - 10000
NSMonthCalendarUnit = 1 - 12
NSDayCalendarUnit = 1 - 31
NSHourCalendarUnit = 0 - 24
NSMinuteCalendarUnit = 0 - 60
NSSecondCalendarUnit = 0 - 60
NSWeekCalendarUnit = 1 - 53
NSWeekdayCalendarUnit = 1 - 7
NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
(NSNotFound - NSNotFound)
- (NSRange)minimumRangeOfUnit:(NSCalendarUnit)unit;
返回单元的最小范围。就Gregorian来说有:
NSEraCalendarUnit => 0 - 2
NSYearCalendarUnit => 1 - 10000
NSMonthCalendarUnit = 1 - 12
NSDayCalendarUnit = 1 - 28 ***
NSHourCalendarUnit = 0 - 24
NSMinuteCalendarUnit = 0 - 60
NSSecondCalendarUnit = 0 - 60
NSWeekCalendarUnit = 1 - 52 ***
NSWeekdayCalendarUnit = 1 - 7
NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
(NSNotFound - NSNotFound)
- (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
返回某个特定时间(date)其对应的小的时间单元(smaller)在大的时间单元(larger)中的顺序,比如:
. 要取得2008/11/12在当月的第几周则可以这样调用该方法:
[calendar ordinalityOfUnit:NSWeekOrdinalCalendarUnit inUnit: NSWeekCalendarUnit forDate: someDate];
注: someDate存放了2008/11/12
. 要取得1:50分在一天中处于第几个小时,则可以这样调用该方法:
[calendar ordinalityOfUnit:NSHourCalendarUnit inUnit: NSDayCalendarUnit forDate: someTime];
注: someTime存放了1:50
. 其它请参照firstWeekday和minimumDaysInFirstWeek中的说明
- (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
返回某个特定时间(date)其对应的小的时间单元(smaller)在大的时间单元(larger)中的范围,比如:
. 要取得2008/11/12在所在月份的日期范围则可以这样调用该方法:
[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit: NSMonthCalendarUnit forDate:fDate];
则返回1-31。注: fDate存放了2008/11/12
. 要取得2008/02/20在所在月份的日期范围则可以这样调用该方法:
[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:fDate];
则返回1-29。注: fDate存放了2008/11/12
- (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)sDate interval:(NSTimeInterval *)unitSecs forDate:(NSDate *)date;
用于返回日期date(参数)所在的那个日历单元unit(参数)的开始时间(sDate)。其中参数unit指定了日历单元,参数sDate用于返回日历单元的第一天,参数unitSecs用于返回日历单元的长度(以秒为单位),参数date指定了一个特定的日期。
如果startDate和interval均为可计算的,那么函数返回YES否则返回NO.比如:
. 要计算2008/01/08日所在的周的第一天:
...
NSDate *dateOut = [NSDate date];
NSDate **sDate = &dateOut;
NSDateComponents *dc = [[NSDateComponents alloc] init];
[dc setYear: 2008];
[dc setMonth: 1];
[dc setDay: 8];
NSDate *date = [calendar dateFromComponents:dc];
NSTimeInterval intOut;
NSTimeInterval *intervalOut = &intOut;
if ([calendar rangeOfUnit:NSMonthCalendarUnit startDate:sDate interval:interval0 forDate:date]){
NSLog(@"%@", [*sDate description]);
NSLog(@"%f", *intervalOut);
}
else{
NSLog(@"Can not be calculated!");
}
...
在控制台窗口上可以看到:
2008-01-06 00:00:00 +0800
604800.000000
注: 2008-01-06是2008/01/08所在周的第一天,604800是一周7天的秒数。
. 要计算2008/01/05日所在的周的第一天,在控制台窗口上可以看到:
2007-12-30 00:00:00 +0800
604800.000000
. 要计算2008/02/06日所在的月的第一天,在控制台窗口上可以看到:
2007-02-01 00:00:00 +0800
2505600.000000
注: 2505600是二月29天的秒数。
对日期和时间的处理 NSCalendar的更多相关文章
- iOS中的日期和时间
转载于http://www.jianshu.com/p/ee279c175cf8 一.时间和日期计算 我们在应用开发中,时常需要和时间打交道,比如获取当前时间,获取两个时间点相隔的时间等等,在iOS开 ...
- [Java]Java日期及时间库插件 -- Joda Time.
来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处 ...
- SharePoint 2013 日期和时间字段格式设置
前言 最近碰到一个需求,用户希望修改日期和时间字段的格式,因为自己的环境是英文的,默认的时间格式是[月/日/年]这样的格式,我也是碰到这个问题才知道,这是美式的时间格式,然而用户希望变成英式的时间格式 ...
- MySQL 日期、时间转换函数
MySQL 日期.时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式.它是 str_to ...
- python笔记7:日期和时间
Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. 时间 ...
- PHP的日期和时间处理函数
1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...
- Sql Server系列:日期和时间函数
1. 获取系统当前日期函数GETDATE() GETDATE()函数用于返回当前数据库系统的日期和时间,返回值的类型为datetime. SELECT GETDATE() 2. 返回UTC日期的函数G ...
- Sql Server函数全解(四)日期和时间函数
日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外,也可以使用datetime类型的参数,但会忽略这些值的时间部分.相同 ...
随机推荐
- [未完成][Mooc]关于IO总结
整个课程的大纲:1.编码问题.2.File类的使用3.RandomAccessFile的使用4.字节流的使用.5.字符流的使用.6.对象的序列化和反序列化. 视频1:文件的编码Eclipse的一大特点 ...
- hdu 4374 单调队列优化动态规划
思路:我只想说,while(head<=rear&&que[rear].val+sum[j]-sum[que[rear].pos-1]<=dp[i-1][j]+num[i- ...
- hdu 4000 树状数组
思路:找出所有 a<b<c||a<c<b的情况,在找出所有的a<b<c的情况.他们相减剩下就是a<c<b的情况了. #include<iostre ...
- SQL Server 2005中约束
在SQL Server 2005中有6种约束:主键约束(primary key constraint).惟一性约束(unique constraint).检查约束(check constraint). ...
- IIS 发布网站到外网
前段时间做了一个项目在局域网中测试后要发布到外网上,一时间不知怎么搞,以为直接在IIS中修改发布时的IP就可以了,但是不可行,经过摸索终于成功发布到外网,下面是具体步骤. 前期准备:公网IP,掩码,网 ...
- 归约函数reduce&映射数组map(笔记)
function forEach(array,action){ ;i<array.length;i++) action(array[i]); } function reduce(combine, ...
- Android 线程Thread的2种实现方法
在讲解之前有以下三点要说明: 1.在Android中有两种实现线程Thread的方法: ①扩展java.long.Thread类: ②实现Runnable()接口: 2.Thread类是线程类,它有两 ...
- dotnetbar 的BalloonTip的用法
‘设置提示标题 tip.SetBalloonCaption(txt_ID, "提示") ’设置显示的控件 和显示内容文本 tip.SetBalloonText(txt_ID, &q ...
- 有关开机后win7任务管理器不断重启的问题,我的情况是sendrpt.exe导致的(转载,有补充)
SendRpt.exe提示SendRpt:Error资源管理器未响应 打开电脑就发现资源管理器就未响应,还发现一个标题为Report sending utility的SendRpt.exe进程占用CP ...
- NodeJS V8 GC概览
[A tour of V8: Garbage Collection] http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection 基本是 ...