时间与日期处理

主要有以下类:

  • NSDate : 表示一个绝对的时间点
  • NSTimeZone:时区信息
  • NSLocale : 本地化信息
  • NSDateComponents :一个封装了具体年月日、时秒分、周、季度等的类
  • NSCalendar :日历类,它提供了大部分的日期计算接口,并且允许您在 NSDate和NSDateComponents之间转换。默认的是系统时区
  • NSDateFormatter: 用来在日期和字符串之间转换。默认的是系统时区

1 NSDate

NSDate用来表示公历的GMT时间(格林威治时间)。

1.1 以当前时间的偏移秒数来初始化
  • (id)initWithTimeIntervalSinceNow:(NSTimeInterval)seconds 和 (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds

例子:

NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:20];
//NSDate *date = [NSDate dateWithTimeIntervalSinceNow:20];
//假如当前时间是2016-03-22 08:57:20 +0000,那么初始化后得到的时间是2016-03-022 08:57:40 +0000
NSLog(@"print date is %@",date);
1.2 当前对象时间与1970-1-1 0:0:0的相隔秒数
  • (NSTimeInterval)timeIntervalSince1970
NSDate *date = [NSDate dateWithTimeIntervalSince1970:50];
NSInteger seconds = [date timeIntervalSince1970];
//50
NSLog(@"%i",seconds);
1.3 以2001-1-1 0:0:0的偏移秒数来初始化
  • (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds 和 - (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds
NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:80];
//NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:80];
//2001-01-01 00:01:20 +0000
NSLog(@"print date is %@",date);
1.4 返回当前对象时间与参数传递的对象时间的相隔秒数
  • (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate
NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];
NSDate *date2 = [NSDate dateWithTimeInterval:50 sinceDate:date];
NSInteger seconds = [date timeIntervalSinceDate:date2];
//将返回结果-50,date为1970-1-1 0:0:0,date2为1970-1-1 0:0:50,从date2的时间开始,倒退50秒到达date的时间。
NSLog(@"%i",seconds);

2 NSTimeZone

2.1 返回系统时区和本地时区
  • (NSTimeZone )systemTimeZone与 (NSTimeZone )localTimeZone

    两者的区别:
    本地时区可以被修改,而系统时区不能修改。默认为Asia/Shanghai (CST (China)) offset 28800。

//修改本地时区,
[NSTimeZone setDefaultTimeZone:[[NSTimeZone alloc] initWithName:@"America/Chicago"]];
NSTimeZone *systemZone = [NSTimeZone systemTimeZone];
NSTimeZone *localZone = [NSTimeZone localTimeZone];
//Asia/Shanghai (CST (China)) offset 28800
NSLog(@"%@",systemZone);
//Local Time Zone (America/Chicago (CST) offset -21600
NSLog(@"%@",localZone);

例子:

 //求一系列时间的方法
  NSDate * tDateGMT = [NSDate date];
 //获得当前时区 因为系统的为GMT
  NSTimeZone *tTimeZone     = [NSTimeZone systemTimeZone];
 //八小时时差 28800
  NSInteger tChinaToGMT     = [tTimeZone secondsFromGMT];
  //得到真正的时间 
  NSDate *tDateChina        = [NSDate dateWithTimeInterval:tChinaToGMT sinceDate:tDateGMT];
  //打印當前時間
  NSLog(@"%@",tDateChina);
2.2 根据零时区的秒数偏移返回一个新时区对象
  • (id)timeZoneForSecondsFromGMT:(NSInteger)seconds
NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:28800];
//GMT+0800 (GMT+08:00) offset 28800
NSLog(@"%@",zone);
2.3 返回时区对象的名称或缩写
  • (NSString )name 和 - (NSString )abbreviation
NSTimeZone *zone = [NSTimeZone localTimeZone];
NSString *strZoneName = [zone name];
NSString *strZoneAbbreviation = [zone abbreviation];
//name is Asia/Shanghai
NSLog(@"name is %@",strZoneName);
// abbreviation is GMT+8
NSLog(@"abbreviation is %@",strZoneAbbreviation);
2.4 以数组的形式返回所有已知的时区名称

+(NSArray *)knownTimeZoneNames

//zoneArray 数量为427
NSArray *zoneArray = [NSTimeZone knownTimeZoneNames];

for(NSString *str in zoneArray)
{
//Asia/Shanghai
//Asia/Taipei
//Asia/Hong_Kong 等城市
    NSLog(@"%@",str);
}

3 NSLoale

NSLoale类返回本地化信息,主要体现在”语言”和”区域格式”这两个设置项

3.1 返回系统初始本地化信息
  • (id)systemLocale
NSLocale *locale = [NSLocale systemLocale];
//gregorian
NSLog(@"%@",[[locale objectForKey:NSLocaleCalendar] calendarIdentifier]);

3.2返回当前客户端的本地化信息

  • (id)currentLocale 和 + (id)autoupdatingCurrentLocale
    区别在于:
    currentLocale取得的值会一直保持在cache中,第一次用此方法实例化对象后,即使修改了本地化设定,这个对象也不会改变。而使用autoupdatingCurrentLocale,当每次修改本地化设定,其实例化的对象也会随之改变
//假设初始本地化信息为en_US,先用这两个函数分别初始化两个对象,然后修改本地化设定语言为台湾繁体中文,再重新打印这两个对象的信息:

NSLocale *locale1;
NSLocale *locale2;

- (IBAction)doTest:(id)sender 
{
    locale1 = [NSLocale currentLocale];
    locale2 = [NSLocale autoupdatingCurrentLocale];

    NSLog(@"%@",locale1.localeIdentifier); //print "en_US"
    NSLog(@"%@",locale2.localeIdentifier); //print "en_US"
}

- (IBAction)doAgain:(id)sender 
{
    NSLog(@"%@",locale1.localeIdentifier); //print "en_US"
    NSLog(@"%@",locale2.localeIdentifier); //print "zh_TW"
}
3.3 不同的key返回各种本地化信息
  • (id)objectForKey:(id)key
NSLocale *locale = [NSLocale currentLocale];
//¥
NSString *strSymbol = [locale objectForKey:NSLocaleCurrencySymbol];
NSCalendar *calendar = [[NSLocale currentLocale] objectForKey:NSLocaleCalendar];
3.4显示特定地区代号下相应键的显示名称
  • (NSString *)displayNameForKey:(id)key value:(id)value
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
NSString *str = [locale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
// 英文(美国)
NSLog(@"%@",str);

4 NSDateComponents

NSDateComponents封装了具体年月日、时秒分、周、季度等

注意:
weekday 从1-7对应星期日-星期六
/*
<NSDateComponents: 0x7fbab9c3bd00>
    Calendar: <_NSCopyOnWriteCalendarWrapper: 0x7fbab9f6b100>
    TimeZone: Asia/Shanghai (GMT+8) offset 28800
    Era: 1
    Calendar Year: 2013
    Month: 3
    Day: 15
    Hour: 11
    Minute: 20
    Second: 55
    Quarter: 2
    Week of Year: 2
    Week of Month: 3
    Week (obsolete): 3
    Weekday: 4


*/
NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setEra:1];
[compt setYear:2013];
[compt setMonth:3];
[compt setDay:15];
[compt setHour:11];
[compt setMinute:20];
[compt setSecond:55];
[compt setQuarter:2];
//默认就是系统时区
[compt setTimeZone:[NSTimeZone systemTimeZone]];
[compt setWeek:3];
//星期三
[compt setWeekday:4];
[compt setWeekOfMonth:3];
[compt setWeekOfYear:2];
[compt setCalendar:[NSCalendar currentCalendar]];
4.1 取得一个NSDate对象的1个或多个部分,用NSDateComponents来封装.

需要注意的是,只有明确指定了unitFlags,NSDateComponents相应的那一部分才有值。

  • (NSDateComponents )components:(NSUInteger)unitFlags fromDate:(NSDate )date
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
//NSDateComponents *compt = [calendar components:NSDayCalendarUnit fromDate:date];
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0

     NSDateComponents *compt = [calendar components:(NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay) fromDate:date];

#else

    NSDateComponents *compt = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date];

#endif


//2016,2016-03-24 08:21:08 +0000
NSLog(@"%d,%@",[compt year],date);
//3,2016-03-24 08:21:08 +0000
NSLog(@"%d,%@",[compt month],date);
//24,2016-03-24 08:21:08 +0000
NSLog(@"%d,%@",[compt day],date);
4.2 取得两个NSDate对象的时间间隔,用NSDateComponents来封装
  • (NSDateComponents )components:(NSUInteger)unitFlags fromDate:(NSDate )startingDate toDate:(NSDate *)resultDate options : (NSUInteger)opts

有几点需要注意:
① 得到的NSDateComponents对象可能会包含负数。例如:当toDate比fromDate晚10秒,second部分返回10;当toDate比fromDate早10秒,second部分返回-10

② 当指定unitFlags返回多个部分时,相隔的时间由多个部分共同组成(而不是独立去表示)。例如:上面的例子时间相差5小时1分15秒,如果指定只返回second部分,将得到18075秒;如果指定返回minute和second部分,将得到301分15秒;如果指定返回hour、minute和second,将得到5小时1分15秒。

 NSCalendar *calendar = [NSCalendar currentCalendar];
 NSDate *date = [NSDate date];
 NSDate *date2 = [NSDate dateWithTimeInterval:5*60*60+75 sinceDate:date];
    NSDateComponents *compt = [calendar components:(NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:date toDate:date2 options:0];
    //301
    NSLog(@"%d",[compt minute]);
    //15
    NSLog(@"%d",[compt second]);
    //-1 如果没有在unitFlags中指定,则为-1
     NSLog(@"%d",[compt hour]);
4.3 根据NSDateComponents对象得到一个NSDate对象
  • (NSDate )dateFromComponents:(NSDateComponents )comps
NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setYear:2012];
[compt setMonth:5];
[compt setDay:11];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:compt];
//得到本地时间,避免时区问题
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate:date];
NSDate *localeDate = [date dateByAddingTimeInterval:interval];
//2012-05-11 00:00:00 +0000
NSLog(@"%@",localeDate);
4.4 在参数date基础上,增加一个NSDateComponents类型的时间增量
  • (NSDate )dateByAddingComponents:(NSDateComponents )comps toDate:(NSDate *)date options:(NSUInteger)opts
  //增加1天4小时66分,也就是1天5小时6分钟
    NSDateComponents *compt2 = [[NSDateComponents alloc] init];
    [compt2 setDay:1];
    [compt2 setHour:4];
    [compt2 setMinute:66];

    NSCalendar *calendar2 = [NSCalendar currentCalendar];
    NSDate *date3 = [NSDate date];
    NSDate *date2= [calendar2 dateByAddingComponents:compt2 toDate:date3 options:0];

    //得到本地时间,避免时区问题
    NSTimeZone *zone2 = [NSTimeZone systemTimeZone];
    NSInteger interval2 = [zone2 secondsFromGMTForDate:date2];
    NSDate *localeDate2 = [date2 dateByAddingTimeInterval:interval2];
    NSDate *localeDate3 = [date3 dateByAddingTimeInterval:interval2];

    //2016-03-28 15:06:02 +0000
    NSLog(@"%@",localeDate2);
    //2016-03-27 10:00:02 +0000
     NSLog(@"%@",localeDate3);

5 NSCalendar

5.1 返回当前客户端的逻辑日历

  • (id)currentCalendar / + (id)autoupdatingCurrentCalendar

区别在于:currentCalendar取得的值会一直保持在cache中,第一次用此方法实例化对象后,即使修改了系统日历设定,这个对象也不会改变。而使用autoupdatingCurrentCalendar,当每次修改系统日历设定,其实例化的对象也会随之改变

下面的代码演示了区别所在,假设初始Calendar设定为NSGregorianCalendar(公历),先用这两个函数分别初始化两个对象,然后修改系统日历为NSJapaneseCalendar(日本和历),再重新打印这两个对象的信息:

NSCalendar *calendar;
NSCalendar *calendar2;

- (IBAction)doTest:(id)sender 
{
    calendar = [NSCalendar currentCalendar];
    calendar2 = [NSCalendar autoupdatingCurrentCalendar];

    NSLog(@"%@",calendar.calendarIdentifier); //print "gregorian"
    NSLog(@"%@",calendar2.calendarIdentifier); //print "gregorian"
}

- (IBAction)doAgain:(id)sender 
{
    NSLog(@"%@",calendar.calendarIdentifier); //print "gregorian"
    NSLog(@"%@",calendar2.calendarIdentifier); //print "japanese"
}
5.2 根据提供的日历标示符初始化
  • (id)initWithCalendarIdentifier:(NSString *)string

系统中定义的日历有:

NSGregorianCalendar – 公历
NSBuddhistCalendar – 佛教日历
NSChineseCalendar – 中国农历
NSHebrewCalendar – 希伯来日历
NSIslamicCalendar – 伊斯兰历
NSIslamicCivilCalendar – 伊斯兰教日历
NSJapaneseCalendar – 日本日历
NSRepublicOfChinaCalendar – 中华民国日历(台湾)
NSPersianCalendar – 波斯历
NSIndianCalendar – 印度日历
NSISO8601Calendar – ISO8601

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0    
    NSCalendar *calendar33 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese];
#else
     NSCalendar *calendar33 = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];
#endif    
 //chinese
NSLog(@"%@",calendar33.calendarIdentifier);
5.3 设置本地化信息
  • (void)setLocale:(NSLocale *)locale
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
//zh_CN
NSLog(@"%@",calendar.locale.localeIdentifier);
5.4 设置本地化信息
  • (void)setTimeZone:(NSTimeZone *)tz
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"HKT"]];
//Asia/Hong_Kong (GMT+8) offset 28800
NSLog(@"%@",calendar.timeZone);
5.5 设置每周的第一天从星期几开始,比如:1代表星期日开始,2代表星期一开始,以此类推。默认值是1
  • (void)setFirstWeekday:(NSUInteger)weekday
    如图所示,如果从星期日开始,日历的表现形式:
    这里写图片描述
    如果从星期二开始,日历的表现形式
    这里写图片描述
//如果从星期二开始
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setFirstWeekday:3];
NSLog(@"%i",calendar.firstWeekday);
5.6 设置每年及每月第一周必须包含的最少天数,比如:设定第一周最少包括3天,则value传入3
  • (void)setMinimumDaysInFirstWeek:(NSUInteger)mdw
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setMinimumDaysInFirstWeek:3];
//3
NSLog(@"%i",calendar.minimumDaysInFirstWeek);
5.7 获取一个小的单位在一个大的单位里面的序数
  • (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date

NSCalendarUnit包含的值有:
NSEraCalendarUnit – 纪元单位。对于NSGregorianCalendar(公历)来说,只有公元前(BC)和公元(AD);而对于其它历法可能有很多,例如日本和历是以每一代君王统治来做计算。
NSYearCalendarUnit – 年单位。值很大,相当于经历了多少年,未来多少年。
NSMonthCalendarUnit – 月单位。范围为1-12
NSDayCalendarUnit – 天单位。范围为1-31
NSHourCalendarUnit – 小时单位。范围为0-24
NSMinuteCalendarUnit – 分钟单位。范围为0-60
NSSecondCalendarUnit – 秒单位。范围为0-60
NSWeekCalendarUnit – 周单位。范围为1-53
NSWeekdayCalendarUnit – 星期单位,每周的7天。范围为1-7
NSWeekdayOrdinalCalendarUnit – 没完全搞清楚
NSQuarterCalendarUnit – 几刻钟,也就是15分钟。范围为1-4
NSWeekOfMonthCalendarUnit – 月包含的周数。最多为6个周
NSWeekOfYearCalendarUnit – 年包含的周数。最多为53个周
NSYearForWeekOfYearCalendarUnit – 没完全搞清楚
NSTimeZoneCalendarUnit – 没完全搞清楚

① 当小单位为NSWeekdayCalendarUnit,大单位为NSWeekCalendarUnit时(即某个日期在这一周是第几天),根据firstWeekday属性不同,返回的结果也不同。
对于2016.3.27 星期日
例如:
默认firstWeekday为1(星期日开始)的情况下,得到的结果是1,从下图可以看到是第1天。

这里写图片描述
假如firstWeekday被设置为2(星期一开始)的情况下,得到的结果是1,从下图可以看到是第7天
这里写图片描述

//默认设置星期日为每周的第一天
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];   
int count = [calendar ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
//1
NSLog(@"%d",count);


//设置星期一为每周的第一天
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];   
[calendar setFirstWeekday:2];
int count = [calendar ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
//7
//NSLog(@"%d",count);

② 当小单位为NSWeekCalendarUnit,大单位为NSYearCalendarUnit时(即某个日期在这一年中是第几周),根据minimumDaysInFirstWeek属性不同,返回的结果也不同。
对于2015.1.10 星期六
例如:
1. 默认minimumDaysInFirstWeek为5的情况下,得到的结果是2,从下图可以看到是第2周。
说明:默认情况下第一个周有5天,其中1月1日–1月4日被划分到了上一年,返回0;而1月5日–1月9日升为第一周,1月10日–1月14日升为第二周。。依此类推。
这里写图片描述
2. minimumDaysInFirstWeek为6的情况下,得到的结果是1,从下图可以看到是第1周。
这里写图片描述

//默认情况下第一个周有5天的时候
 NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setYear:2015];
[compt setMonth:1];
[compt setDay:10];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:compt];
int count = [calendar ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:date];
//2
NSLog(@"%d",count);

//一周6天的时候
 NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setYear:2015];
[compt setMonth:1];
[compt setDay:10];
NSCalendar *calendar = [NSCalendar currentCalendar];
 NSDate *date = [calendar dateFromComponents:compt];
 [calendar setMinimumDaysInFirstWeek:6];
int count = [calendar ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:date];
//1
NSLog(@"%d",count);

5.8 根据参数提供的时间点,得到一个小的单位在一个大的单位里面的取值范围

  • (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
 NSDateComponents *compt = [[NSDateComponents alloc] init];
    [compt setYear:2015];
    [compt setMonth:1];
    [compt setDay:10];
    [compt setHour:9];
    [compt setMinute:45];
    [compt setSecond:30];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *date = [calendar dateFromComponents:compt];

    //得到本地时间,避免时区问题
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSInteger interval = [zone secondsFromGMTForDate:date];
    NSDate *localeDate = [date dateByAddingTimeInterval:interval];

    NSRange range = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:localeDate];
    //1--31
    NSLog(@"%d -- %d",range.location,range.length);

调用这个方法要明确一点,取得的是”范围”而不是”包含”,下面是一些例子:

① 小单位是NSDayCalendarUnit,大单位是NSYearCalendarUnit,并不是要取这一年包含多少天,而是要取”天”(Day)这个单位在这一年(Year)的取值范围。其实不管你提供的日期是多少,返回的值都是”1–31”。

② 小单位是NSDayCalendarUnit,大单位是NSMonthCalendarUnit。要取得参数时间点所对应的月份下,”天”(Day)的取值范围。根据参数时间的月份不同,值也不同。例如2月是1–28、3月是1–31、4月是1–30。

③ 小单位是NSWeekCalendarUnit,大单位是NSMonthCalendarUnit。要取得参数时间点所对应的月份下,”周”(Week)的取值范围。需要注意的是结果会受到minimumDaysInFirstWeek属性的影响。在默认minimumDaysInFirstWeek情况下,取得的范围值一般是”1–5”,从日历上可以看出来这个月包含5排,即5个周。

④ 小单位是NSDayCalendarUnit,大单位是NSWeekCalendarUnit。要取得周所包含的”天”(Day)的取值范围。与setFirstWeekday属性的设置有关,默认为1(星期日)。下面是一个示例日历图:

这里写图片描述

在上图的日期条件下,假如提供的参数是1月1日–1月3日,那么对应的week就是1(第一个周),可以看到第一个周包含有3天,从1号开始,那么最终得到的范围值为1–3。

假如提供的参数是1月4日,那么对应的week是2第二个周),第二个周包含有7天,从14号开始,那么最终得到的范围值是4–7。

假如提供的参数是1月11日,那么对应的week是3(第三个周),第三个周包含7天,从1号开始,那么最终得到的范围值是11–7。

5. 9 根据参数提供的时间点,返回所在日历单位的开始时间。如果startDate和interval均可以计算,则返回YES;否则返回NO
  • (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval )tip forDate:(NSDate *)date

unit – 日历单位
datep – 开始时间,通过参数返回
tip – 日历单位所对应的秒数,通过参数返回
date – 时间点参数

NSDate *dateOut = nil;
    NSTimeInterval count = 0;

    NSDateComponents *compt = [[NSDateComponents alloc] init];
    [compt setYear:2016];
    [compt setMonth:3];
    [compt setDay:27];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *date = [calendar dateFromComponents:compt];
    BOOL b = [calendar rangeOfUnit:NSMonthCalendarUnit startDate:&dateOut interval:&count forDate:date];
    if(b)
    {
        //得到本地时间,避免时区问题
        NSTimeZone *zone = [NSTimeZone systemTimeZone];
        NSInteger interval = [zone secondsFromGMTForDate:dateOut];
        NSDate *localeDate = [dateOut dateByAddingTimeInterval:interval];
        //2016-03-01 00:00:00 +0000
        NSLog(@"%@",localeDate);
        //2678400.000000 (2678400 = 31天 * 24小时 * 60分 * 60秒)
        NSLog(@"%f",count);
    }
    else
    {
        NSLog(@"无法计算");
    }

上面的例子要求返回2016年3月27日当月的起始时间,以及当月的秒数。得到的结果是:2016-03-01 00:00:00 +0000,2678400。(2678400 = 31天 * 24小时 * 60分 * 60秒)。

假如将上面的日历单位改为NSWeekCalendarUnit,那么得到的结果是:2016-03-27 00:00:00 +0000,604800.000000。当周的第一天是3月27日。(604800 = 7天 * 24小时 * 60分 * 60秒)。

假如将上面的日历单位改为NSYearCalendarUnit,那么得到的结果是:2016-01-01 00:00:00 +0000,31536000。这一年的第一天是1月1日,(31536000 = 365天 * 24小时 * 60分 * 60秒)。

5.10 返回星期
calendar.weekdaySymbols;

返回:
@[@”星期日”,@”星期一”,@”星期二”,@”星期三”,@”星期四”,@”星期五”,@”星期六”];

6 NSDateFormatter

NSDateFormatter的日期格式如下:

G -- 纪元
一般会显示公元前(BC)和公元(AD)

y -- 
假如是2013年,那么yyyy=2013,yy=13  

M -- 
假如是3月,那么M=3,MM=03,MMM=Mar,MMMM=March
假如是11月,那么M=11,MM=11,MMM=Nov,MMMM=November

w -- 年包含的周
假如是1月8日,那么w=2(这一年的第二个周)

W -- 月份包含的周(与日历排列有关)
假如是2013年4月21日,那么W=4(这个月的第四个周)

F -- 月份包含的周(与日历排列无关)
和上面的W不一样,F只是单纯以7天为一个单位来统计周,例如7号一定是第一个周,15号一定是第三个周,与日历排列无关。

D -- 年包含的天数
假如是1月20日,那么D=20(这一年的第20天)
假如是2月25日,那么D=31+25=56(这一年的第56天)

d -- 月份包含的天数
假如是5号,那么d=5,dd=05
假如是15号,那么d=15,dd=15

E -- 星期 
假如是星期五,那么E=Fri,EEEE=Friday

a -- 上午(AM)/下午(PM)

H -- 24小时制,显示为0--23
假如是午夜00:40,那么H=0:40,HH=00:40

h -- 12小时制,显示为1--12
假如是午夜00:40,那么h=12:40

K -- 12小时制,显示为0--11
假如是午夜00:40,那么K=0:40,KK=00:40

k -- 24小时制,显示为1--24
假如是午夜00:40,那么k=24:40

m -- 分钟
假如是5分钟,那么m=5,mm=05
假如是45分钟,那么m=45,mm=45

s -- 
假如是5秒钟,那么s=5,ss=05
假如是45秒钟,那么s=45,ss=45

S -- 毫秒
一般用SSS来显示

z -- 时区
表现形式为GMT+08:00

Z -- 时区
表现形式为+0800

NSDateFormatter的两个最实用的方法是dateFromString和stringFromDate,前者将一个字符串经过格式化后变成NSDate对象,后者将NSDate对象格式化成字符串。

①使用NSDateFormatter转换时间字符串时,默认的时区是系统时区,例如在中国一般都是北京时间(+8),如果直接转换会导致结果相差8小时,所以一般的做法是先指定时区为GMT标准时间再转换:

[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

② 在调用setDateFormat设置格式化字符串时,可以加入一些别的字符串,用单引号来引入,例如:

[formatter setDateFormat:@"yyyy-MM-dd 'some ''special'' string' HH:mm:ss z"];

例子:

 NSDateComponents *compt = [[NSDateComponents alloc] init];
    [compt setYear:2016];
    [compt setMonth:3];
    [compt setDay:27];
    [compt setHour:11];
    [compt setMinute:50];
    [compt setSecond:28];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSTimeZone *tTimeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    [calendar setTimeZone:tTimeZone];
    NSDate *date = [calendar dateFromComponents:compt];
    //2016-03-27 11:50:28 +0000

    NSLog(@"%@",date);

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:tTimeZone];
    [formatter setDateFormat:@"yyyy-MM-dd  HH:mm:ss z   'some ''special'' string'"];
    NSString *str = [formatter stringFromDate:date];
    //2016-03-27 11:50:28 GMT     some 'special' string

    NSLog(@"%@",str);
 NSDateComponents *compt = [[NSDateComponents alloc] init];
    [compt setYear:2016];
    [compt setMonth:3];
    [compt setDay:27];
    [compt setHour:11];
    [compt setMinute:50];
    [compt setSecond:28];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *date = [calendar dateFromComponents:compt];
    //2016-03-27 03:50:28 +0000
    NSLog(@"%@",date);
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd  HH:mm:ss z   'some ''special'' string'"];
    NSString *str = [formatter stringFromDate:date];
    //2016-03-27 11:50:28 GMT+8   some 'special' string
    NSLog(@"%@",str);

注意:

NSString *dateFormat = @"yyyy-MM-dd";
NSString *timeFormat = @"HH:mm";
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:dateFormat];
NSString *dateString = [inputFormatter dateFromString:@"2016-4-20"];
//2016-04-19 16:00:00 +0000,此时说明返回的GMT标准时间下2016-4-20的0点。与系统时间相差8个小时。并且没有指明时间,则以0点为标准。
 NSLog(@"%@",dateString);

NSDateFormatter *inputFormatter2 = [[NSDateFormatter alloc] init];
[inputFormatter2 setDateFormat:timeFormat];
NSString *timeString = [inputFormatter dateFromString:@"14:58"];
//2000-01-01 06:58:00 +0000,,此时说明返回的GMT标准时间下14:58。与系统时间相差8个小时,并且没有指明年月日,则以2000-01-01为基准
NSLog(@"%@",timeString);

原文: 时间与日期处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值