对日期和时间的处理 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类型的参数,但会忽略这些值的时间部分.相同 ...
随机推荐
- Oracle分页查询语句的写法(转)
Oracle分页查询语句的写法(转) 分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的 ...
- saltstack实战3--配置管理之grains
grains是什么 grains是minion服务启动后,采集的客户端的一些基本信息,硬件信息,软件信息,网络信息,软件版本等.你可以在minion上自定义一些grains信息. 它是静态的信息,mi ...
- js中定义对象的方式有哪些?
1.对象直接量 2.构造函数 3.原型方法 4.动态原型方法
- Agile.Net 组件式开发平台 - 脚本管理组件
脚本管理组件用于管理系统查询脚本,由于数据查询的复杂性和可变性,平台规范要求使用查询使用建立在脚本管理器中的SQL语句.新增.更新.删除数据采用数据访问支持库API. 示例如下: 首先在脚本管理器中定 ...
- lstm-思想2
LSTM 网络 Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息.LSTM 由 Hochreiter & Schmidhub ...
- Linux 命令行技巧
这是一个linux常见命令的列表.那些有• 标记的条目,你可以直接拷贝到终端上而不需要任何修改,因此你最好开一个终端边读边剪切&拷贝.所有的命令已在Fedora和Ubuntu下做了测试 命令 ...
- Java Thread UncaughtExceptionHandler
有没有发生过这样的情况,你写的工作线程莫名其妙的挂了,如果不是被你刚好看到,拿只能抓瞎了,不知道啥原因了,因为异常的时候只会把stack trace打在控制台上,不会记在你想记得错误日志里,头皮都抓破 ...
- des算法的C#实现
DES是Data Encryption Standard(数据加密标准)的缩写.它是一种通过56位密钥来加密64位数据的方法. public class EncryptUtility{ #reg ...
- c#索引器的简单用法
abstract class Bird { protected string name; public abstract string Name { get; set; } public abstra ...
- .NET常用网络资源收藏
.NET核心站点: Microsoft主页 https://www.microsoft.com ASP.NET主页 http://www.asp.net TechNet中文网 https://tech ...