NSCalendar api

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值