服务器返回的时间是字符串,手机获取的时间是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开始走过的毫秒数
```objc
// iOS中接收的参数是秒,需要将时间戳的毫秒转成秒
[NSDate dateWithTimeIntervalSince1970:string.longLongValue / 1000.0];
```
##NSData -> NSString
```objc
// 日期对象
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之间大小比较
```objc
/*
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;
}
```
###获取时间间隔差值
```objc
// 手机当前时间和1970年的时间间隔(s)
NSDate *nowDate = [NSDate date];
NSTimeInterval interval = [nowDate timeIntervalSince1970];
// 手机当前事件和createdAtDate之间的时间间隔(s)
NSTimeInterval interval = [nowDate timeIntervalSinceDate:createdAtDate];
```
获取两个时间间隔之后,想要转换成自然语言时间间隔,需要经过计算,考虑到可能会有很多地方要用,抽取成分类
```objc
#import <Foundation/Foundation.h>
// 一次返回多个相关联的值,直接用模型封装
@interface XYDateItem : NSObject
@property (nonatomic, assign) NSInteger day;
@property (nonatomic, assign) NSInteger hour;
@property (nonatomic, assign) NSInteger minute;
@property (nonatomic, assign) NSInteger second;
@end
@interface NSDate (XYExtension)
- (XYDateItem *)xy_timeIntervalSinceDate:(NSDate *)date;
@end
#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之后)
```objc
- (NSInteger)component:(NSCalendarUnit)unit fromDate:(NSDate *)date
```
##获取日期元素
```objc
// unit传入什么值,就获取到什么元素,没传入的不获取
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
```
##计算两个NSDate之间的时间间隔
```objc
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
```
##判断是不是在某一范围
如判断NSDate数据是不是今天/昨天/明天/周末等等
- iOS8之后NSCalendar自带方法
```objc
// NSCalendar自带方法, iOS8开始
- (BOOL)isDateInToday:(NSDate *)date
- (BOOL)isDateInYesterday:(NSDate *)date
- (BOOL)isDateInTomorrow:(NSDate *)date
- (BOOL)isDateInWeekend:(NSDate *)date
```
- iOS8之前自己写方法
```objc
/** 是不是今天 */
- (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以下系统会报未找到方法的错误
网友评论