OC和Swift的NSDate时间的简单整理:
+(我们通过网络数据请求获得的时间是不能直接显示到客户端的,必须经过处理。用到的时候一般都会配合分类来使用,如先判断是否为今年,今天,昨天等,在进行时间差的比较。为了代码的封装性和易用性。我们通常把比较时间差代码封装到分类,这些都是已经封装好的代码。详情请看下面:)
时间未处理处理之前:
时间经过处理之后:
-1 OC版的时间处理
- 服务器返回的格式: 2017-01-13 18:58:02
################################ .h文件 ##################################
// NSDate+MGExtension.h
// Created by ming on 14/11/25.
// Copyright © 2014年 ming. All rights reserved.
#import <Foundation/Foundation.h>
@interface NSDate (MGExtension)
/**
* 比较self和from时间的差值
* 返回一个NSDateComponents:包括年月日时分秒
*/
- (NSDateComponents *)mg_deltaFrom:(NSDate *)from;
/**
* 是否为今年
*/
- (BOOL)mg_isThisYear;
/**
* 是否为今天
*/
- (BOOL)mg_isToday;
/**
* 是否为昨天
*/
- (BOOL)mg_isYesterday;
@end
################################ .m文件 ##################################
// NSDate+MGExtension.m
// Created by ming on 14/11/25.
// Copyright © 2014年 ming. All rights reserved.
/**
* 这是一个处理时间的分类(用于计算服务器返回的时间与当前时间比较)
* 分为:
* 今年 非今年
* 今天 昨天 明天
* 几小时前 几分钟前 一分钟以内
*/
#import "NSDate+MGExtension.h"
@implementation NSDate (MGExtension)
- (NSDateComponents *)mg_deltaFrom:(NSDate *)from{
// 获取日历
NSCalendar *calendar = [NSCalendar currentCalendar];
// 比较时间
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
return [calendar components:unit fromDate:from toDate:self options:0];
}
/** 是否是今年 */
- (BOOL)mg_isThisYear{
// 获取日历
NSCalendar *calendar = [NSCalendar currentCalendar];
// 比较时间
NSInteger nowYear = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
NSInteger selfYear = [calendar component:NSCalendarUnitYear fromDate:self];
// NSInteger之间的比较
return nowYear == selfYear;
}
/** 是否是今天 */
- (BOOL)mg_isToday{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSString *nowString = [fmt stringFromDate:[NSDate date]];
NSString *selfString = [fmt stringFromDate:self];
// 字符串之间的比较
return [nowString isEqualToString:selfString];
// return [nowString isEqual:selfString];
}
/** 是否是昨天 */
- (BOOL)mg_isYesterday{
// 去除掉时分秒
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth |
NSCalendarUnitDay;
NSDateComponents *coms = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
return coms.year == 0
&& coms.month == 0
&& coms.day == 1;
}
/** 是否是明天 (注:这个只是扩展,实际开发不会用到是否是明天的) */
- (BOOL)mg_isTomorrow{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth |
NSCalendarUnitDay;
NSDateComponents *coms = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
return coms.year == 0
&& coms.month == 0
&& coms.day == -1;
}
@end
外部调用(OC)
/**
* 拿到服务器返回的时间和当前时间进行比较
* 返回一个字符串时间
*/
- (NSString *)created_at{
// 1.创建NSDateFormatter对象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 1.1并日期格式化
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 1.2拿到服务器返回的时间
NSDate *creat = [fmt dateFromString:_created_at];
// 2.判断服务器返回的时间
if (creat.mg_isThisYear) { // 今年
if (creat.mg_isToday) { // 今天
NSDateComponents *coms = [[NSDate date] mg_deltaFrom:creat];
if (coms.hour > 1) { // 几小时前
return [NSString stringWithFormat:@"%zd小时前",coms.hour];
}else if (coms.minute > 1){ // 几分钟前
return [NSString stringWithFormat:@"%zd分钟前",coms.minute];
}else{ // 刚刚
return @"刚刚";
}
}else if (creat.mg_isYesterday){// 昨天
fmt.dateFormat = @"昨天 HH:mm:ss";
return [fmt stringFromDate:creat];
}else{ // 今年其他日子
fmt.dateFormat = @"MM-dd HH:mm:ss";
return [fmt stringFromDate:creat];
}
}else{ // 非今年
return _create_time;
}
}
-
注意:时间的格式要根据服务器返回的时间类型,要不然会转换失败
- 日期格式化 根据服务器返回的时间类型确定
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
- 日期格式化 根据服务器返回的时间类型确定
-
2 Swift2.2版的时间处理
NSDate+Extension.swift
Created by ming on 16/2/1.
Copyright © 2016年 ming. All rights reserved.
import UIKit
extension NSDate {
/**
* 根据字符串转换时间
*/
class func dateWithString(str: String) -> NSDate? {
// 1.创建时间格式化对象
let formatter = NSDateFormatter()
// 2.指定时间格式
formatter.dateFormat = "EEE MM dd HH:mm:ss Z yyyy"
// 3.指定时区
formatter.locale = NSLocale(localeIdentifier: "en")
// 4.转换时间
return formatter.dateFromString(str)
}
/**
* 获取当前时间的格式
* 返回一个字符串时间
*/
func desStr() -> String{
// 0.1.创建一个日历类
let calendar = NSCalendar.currentCalendar()
// 0.2.利用日历类从指定时间从获取指定的组成成分
// 1.1.创建时间格式化对象
let formatter = NSDateFormatter()
// 1.2.指定时区
formatter.locale = NSLocale(localeIdentifier: "en")
if calendar.isDateInToday(self){ // 2.1判断是否是今天
// 获取当前时间与指定时间的差值
let res = Int(NSDate().timeIntervalSinceDate(self))
if res < 60 { // 刚刚
return "刚刚"
}else if res < 60 * 60 { // 多少分钟前
return "\(res/60)分钟前"
}else if res < 24 * 60 * 60 { // 多少小时前
return "\(res/(60*60))小时前"
}
}else if calendar.isDateInYesterday(self){ // 2.2判断是否是昨天
formatter.dateFormat = "昨天 HH:mm"
return formatter.stringFromDate(self)
}
/// 如果能来到这里,肯定不是今天或者昨天
let comps = calendar.components(NSCalendarUnit.Year, fromDate: self, toDate: NSDate(), options: NSCalendarOptions(rawValue:0))
if comps.year < 1 { // 2.3一年以内
formatter.dateFormat = "MM-dd HH:mm"
return formatter.stringFromDate(self)
}else{ // 2.4更早时间
formatter.dateFormat = "yyyy-MM-dd HH:mm"
return formatter.stringFromDate(self)
}
}
}
外部调用(Swift)
// 设置以及处理过的时间
var timeText: String?
{
// 守卫
guard let timeStr = status?.created_at else{
return ""
}
guard let date = NSDate.dateWithString(timeStr) else {
return ""
}
return date.desStr()
}
-
3 Swift3.x版的时间处理
extension Date {
/**
* 根据字符串转换时间
*/
static func dateWithString(str: String) -> Date? {
// 1.创建时间格式化对象
let formatter = DateFormatter()
// 2.指定时间格式
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
// 3.指定时区
formatter.locale = Locale(identifier: "en")
// 4.转换时间
return formatter.date(from: str)
}
/**
* 获取当前时间的格式
* 返回一个字符串时间
*/
func desStr() -> String{
// 0.1.创建一个日历类
let calendar = NSCalendar.current
// 0.2.利用日历类从指定时间从获取指定的组成成分
// 1.1.创建时间格式化对象
let formatter = DateFormatter()
// 1.2.指定时区
formatter.locale = Locale(identifier: "en") //Locale(identifier: "en")
if calendar.isDateInToday(self){ // 2.1判断是否是今天
// 获取当前时间与指定时间的差值
let res = Int(Date().timeIntervalSince(self))
if res < 60 { // 刚刚
return "刚刚"
}else if res < 60 * 60 { // 多少分钟前
return "\(res/60)分钟前"
}else if res < 24 * 60 * 60 { // 多少小时前
return "\(res/(60*60))小时前"
}
}else if calendar.isDateInYesterday(self){ // 2.2判断是否是昨天
formatter.dateFormat = "昨天 HH:mm"
return formatter.string(from: self)
}
/// 如果能来到这里,肯定不是今天或者昨天
let comps = calendar.dateComponents([.year], from: self, to: Date())
if comps.year! < 1 { // 2.3一年以内
formatter.dateFormat = "MM-dd HH:mm"
return formatter.string(from: self)
}else{ // 2.4更早时间
formatter.dateFormat = "yyyy-MM-dd HH:mm"
return formatter.string(from: self)
}
}
}