時間格式化 當(dāng)天顯示為 今天 和 HH:mm, 非當(dāng)天顯示MM/dd 和 HH:mm, 非當(dāng)年的顯示yyyy年

最近有個需求處理時間格式化如下圖


時間格式化效果.png

當(dāng)天顯示為 今天 和 HH:mm, 不是同一天的顯示為 MM/dd 和 HH:mm, 非當(dāng)年的顯示yyyy年
最后用了一個簡單的思路來解決下

先寫一個工具類
.h文件
@interface TimeModel : NSObject

@property (nonatomic, copy) NSString *yearString;

@property (nonatomic, copy) NSString *monthDayString;

@property (nonatomic, copy) NSString *timeString;

/*
 * 時間格式化  當(dāng)天顯示為  今天 和 HH:mm,  非當(dāng)天顯示MM/dd 和 HH:mm, 非當(dāng)年的顯示yyyy年
 *pragma prevDate - 上一個時間
 *pragma nextDate - 當(dāng)前需要計算的時間
 *pragma formate - 時間格式化樣式
 */
+ (TimeModel *)formateDate:(NSDate *)prevDate
                  nextDate:(NSDate *)nextDate
               withFormate:(NSString *)formate;

@end
.m文件
@implementation TimeModel

/*
 * 時間格式化  當(dāng)天顯示為  今天 和 HH:mm,  非當(dāng)天顯示MM/dd 和 HH:mm, 非當(dāng)年的顯示yyyy年
 *pragma prevDate - 上一個時間
 *pragma nextDate - 當(dāng)前需要計算的時間
 *pragma formate - 時間格式化樣式
 */
+ (TimeModel *)formateDate:(NSDate *)prevDate
                  nextDate:(NSDate *)nextDate
               withFormate:(NSString *)formate
{
    @try {

        if (formate.length < 0) {
            formate = @"yyyy-MM-dd HH:mm:ss";
        }
    
        //實例化一個NSDateFormatter對象
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:formate];
        
        NSDate * nowDate = [NSDate date];

        // 再然后,把間隔的秒數(shù)折算成天數(shù)和小時數(shù):
        NSString *yearString = @"";
        NSString *monthDayString = @"";
        NSString *timeString = @"";

        /** 同一天的數(shù)據(jù) */
        [dateFormatter setDateFormat:@"MM/dd"];
        NSString *prevMonthDay = [dateFormatter stringFromDate:prevDate];
        NSString *needMonthDay = [dateFormatter stringFromDate:nextDate];
        NSString *nowMonthDay = [dateFormatter stringFromDate:nowDate];
        
        /** 同一年 */
        [dateFormatter setDateFormat:@"yyyy年"];
        NSString *prevYear = [dateFormatter stringFromDate:prevDate];
        NSString *needYear = [dateFormatter stringFromDate:nextDate];
        NSString *nowYear = [dateFormatter stringFromDate:nowDate];
        
        
        /** 處理顯示年 */
        if (![needYear isEqualToString:prevYear]) {
            yearString = needYear;
            if (!prevYear && [needYear isEqualToString:nowYear]) {
                yearString = @"";
            }
        }
        
        /** 處理顯示天 */
        if (![needMonthDay isEqualToString:prevMonthDay]) {
            monthDayString = needMonthDay;
            [dateFormatter setDateFormat:@"HH:mm"];
            timeString = [dateFormatter stringFromDate:nextDate];
            if (!prevMonthDay) {
                if ([needMonthDay isEqualToString:nowMonthDay]) {
                    monthDayString = @"今天";
                }
            }
        } else {
            [dateFormatter setDateFormat:@"HH:mm"];
            timeString = [dateFormatter stringFromDate:nextDate];
        }
        
        TimeModel *timeModel = [[TimeModel alloc] init];
        timeModel.yearString = yearString;
        timeModel.monthDayString = monthDayString;
        timeModel.timeString = timeString;
        return timeModel;
        
    } @catch (NSException *exception) {
        TimeModel *timeModel = [[TimeModel alloc] init];
        return timeModel;
    }
}
@end

實際中的業(yè)務(wù)邏輯是可以獲取到一些時間數(shù)組,以時間戳為例

//獲取當(dāng)前時間戳 (以毫秒為單位)
+ (NSString *)getNowTimeTimestamp3{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss SSS"]; // ----------設(shè)置你想要的格式,hh與HH的區(qū)別:分別表示12小時制,24小時制
    //設(shè)置時區(qū),這個對于時間的處理有時很重要
    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
    [formatter setTimeZone:timeZone];
    NSDate *datenow = [NSDate date];//現(xiàn)在時間,你可以輸出來看下是什么格式
    NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]*1000];
    return timeSp;
}

/** 存儲時間戳數(shù)組 */
- (NSMutableArray *)dataArray
{
    if (!_dataArray) {
        _dataArray = [NSMutableArray array];
        [_dataArray addObject:[[self class] getNowTimeTimestamp3]];
        [_dataArray addObject:@"1634300370000"];
        [_dataArray addObject:@"1634806363000"];
        [_dataArray addObject:@"1634806422000"];
    }
    return _dataArray;
}

/** 存儲格式化后的 TimeModel 數(shù)據(jù) */
- (NSMutableArray *)resultArray
{
    if (!_resultArray) {
        _resultArray = [NSMutableArray array];
    }
    return _resultArray;
}

/**
 將時間戳轉(zhuǎn)化為date類型

 @param dateString 毫秒字符串時間
 @return NSDate日期
 */
- (NSDate *)formatDateWithDateString:(NSString *)dateString
{
    NSTimeInterval time = [dateString longLongValue]/1000;
    NSDate *confromTimesp = [NSDate dateWithTimeIntervalSince1970:time];
    return confromTimesp;
}


暫時寫在touch事件里做測試
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.resultArray removeAllObjects];
    
    for (int i = 0; i < self.dataArray.count; i++) {
       
        NSDate *infoDate;
        NSDate *nextDate;
        
        if (i == 0) {
            infoDate = nil;
        }else{
            infoDate = [self formatDateWithDateString:self.dataArray[i-1]];
        }
        nextDate = [self formatDateWithDateString:self.dataArray[i]];

        TimeModel *timeModel = [[self class] formateDate:infoDate nextDate:nextDate withFormate:@""];
        [self.resultArray addObject:timeModel];
    }
    
    NSLog(@"self.resultArray = %@", self.resultArray);
    
}

時間處理結(jié)束

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容