NSCalendar api

来源:互联网 发布:九鼎投资 知乎 编辑:程序博客网 时间:2024/05/23 10:37

iOS日期处理
144 作者 ice_backy 关注
2016.05.31 13:57 字数 1253 阅读 120评论 0喜欢 0
服务器返回的时间是字符串,手机获取的时间是NSDate,需要进行转换。

凡是日期处理,这三个类足够了

NSDate
NSDateFormatter
NSCalendar
NSDate

// 获取当前时间(0时区)
NSDate *now = [NSDate date];
NSDateFormatter

NSDateFormatter类的作用

NSString * -> NSDate *
NSDate * -> NSString *
NSString -> NSDate

创建日期格式化类
设置日期格式
如果是欧美时间,设置语言代码
NSString转NSDate
服务器返回的是普通格式时间

// 时间字符串
NSString *string = @”2015-12-10 19:25:07”;

// 日期格式化对象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

// 日期格式
fmt.dateFormat = @”yyyy-MM-dd HH:mm:ss”;

// NSString -> NSDate
NSDate *date = [fmt dateFromString:string];
服务器返回的是欧美时间

在iOS中设置欧美日期,需要设置语言区域

// 时间字符串
NSString *string = @”Tue May 31 17:46:55 +0800 2011”;

// 日期格式化对象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

// 日期格式
fmt.dateFormat = @”EEE MMM dd HH:mm:SS Z yyyy”;
// 语言代码
fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@”en_US”];

// NSString -> NSDate
NSDate *date = [fmt dateFromString:string];
服务器返回的是时间戳

时间戳:从1970-01-01 00:00:00开始走过的毫秒数
// iOS中接收的参数是秒,需要将时间戳的毫秒转成秒
[NSDate dateWithTimeIntervalSince1970:string.longLongValue / 1000.0];
NSData -> NSString

// 日期对象
NSDate *date = [NSDate date];

// 日期格式化对象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

// 日期格式
fmt.dateFormat = @”yyyy年MM月dd日 HH:mm:ss”;

// NSDate -> NSString
NSString *string = [fmt stringFromDate:date];
不论是NSString转NSDate,还是NSDate转NSString,进行转换时候,都需要设置格式。

日期比较

两个NSDate之间大小比较

/*
NSComparisonResult取值
NSOrderedAscending = -1L, 升序(右>左)
NSOrderedSame, 相同
NSOrderedDescending, 降序(右<左)
*/
NSComparisonResult result = [nowDate compare:createdAtDate];

switch (result) {
case NSOrderedSame:
NSLog(@”equal”);
break;
case NSOrderedAscending:
NSLog(@”now < createdAt”);
break;
case NSOrderedDescending:
NSLog(@”now > createdAt”);
break;

default:    break;

}
获取时间间隔差值

// 手机当前时间和1970年的时间间隔(s)
NSDate *nowDate = [NSDate date];
NSTimeInterval interval = [nowDate timeIntervalSince1970];

// 手机当前事件和createdAtDate之间的时间间隔(s)
NSTimeInterval interval = [nowDate timeIntervalSinceDate:createdAtDate];
获取两个时间间隔之后,想要转换成自然语言时间间隔,需要经过计算,考虑到可能会有很多地方要用,抽取成分类

import

import “NSDate+XYExtension.h”

static int const secondPerMinute = 60;
static int const secondPerHour = 60 * 60;
static int const secondPerDay = 60 * 60 * 24;

@implementation XYDateItem

  • (NSString *)description
    {
    return [NSString stringWithFormat:@”%zd天%zd小时%zd分%zd秒”, self.day, self.hour, self.minute, self.second];
    }
    @end

@implementation NSDate (XYExtension)

  • (XYDateItem )xy_timeIntervalSinceDate:(NSDate )date
    {
    // self和date的时间间隔
    NSTimeInterval interval = [self timeIntervalSinceDate:date];
    // 转成整型
    int intInterval = interval;

    XYDateItem *item = [[XYDateItem alloc] init];

    item.day = intInterval / secondPerDay;
    item.hour = (intInterval % secondPerDay) / secondPerHour;
    item.minute = ((intInterval % secondPerDay) % secondPerHour) / secondPerMinute;
    item.second = ((intInterval % secondPerDay) % secondPerHour) % secondPerMinute;

    return item;
    }
    @end
    NSCalendar

通过NSCalendar类可以获取日期的各种元素

获取日期某个元素(iOS8之后)

  • (NSInteger)component:(NSCalendarUnit)unit fromDate:(NSDate *)date
    获取日期元素

// unit传入什么值,就获取到什么元素,没传入的不获取
- (NSDateComponents )components:(NSCalendarUnit)unitFlags fromDate:(NSDate )date;
计算两个NSDate之间的时间间隔

  • (NSDateComponents )components:(NSCalendarUnit)unitFlags fromDate:(NSDate )startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
    判断是不是在某一范围

如判断NSDate数据是不是今天/昨天/明天/周末等等

iOS8之后NSCalendar自带方法
// NSCalendar自带方法, iOS8开始
- (BOOL)isDateInToday:(NSDate *)date
- (BOOL)isDateInYesterday:(NSDate *)date
- (BOOL)isDateInTomorrow:(NSDate *)date
- (BOOL)isDateInWeekend:(NSDate *)date
iOS8之前自己写方法
/* 是不是今天 /
- (BOOL)xy_isToday
{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @”yyyyMMdd”;

NSString *selfString = [fmt stringFromDate:self];NSString *nowString = [fmt stringFromDate:[NSDate date]];return [selfString isEqualToString:nowString];

}

/* 是不是昨天 /
- (BOOL)xy_isYesterday
{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @”yyyyMMdd”;

// 生成只有年月日的字符串NSString *selfString = [fmt stringFromDate:self];NSString *nowString = [fmt stringFromDate:[NSDate date]];// 生成只有年月日的日期对象NSDate *selfDate = [fmt dateFromString:selfString];NSDate *nowDate = [fmt dateFromString:nowString];NSCalendar *calendar = [NSCalendar xy_calendar];NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];return cmps.year == 0&& cmps.month == 0&& cmps.day == 1;

}

/* 是不是明天 /
- (BOOL)xy_isTomorrow
{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @”yyyyMMdd”;

// 生成只有年月日的字符串NSString *selfString = [fmt stringFromDate:self];NSString *nowString = [fmt stringFromDate:[NSDate date]];// 生成只有年月日的日期对象NSDate *selfDate = [fmt dateFromString:selfString];NSDate *nowDate = [fmt dateFromString:nowString];NSCalendar *calendar = [NSCalendar xy_calendar];NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];return cmps.year == 0&& cmps.month == 0&& cmps.day == -1;

}
NSCalendar使用注意:

使用calendar过程中,currentCalendar方法在iOS8.0以上有时候会崩溃,改用calendarWithIdentifier方法。
但是如果写成calendarWithIdentifier的话,运行在iOS8以下系统会报未找到方法的错误

0 0