iOS 开发中关于时间显示问题(今天/昨天/前天/星期几/具体日期)

本文探讨了iOS应用中如何以今天为基准,智能显示时间信息,包括‘今天’、‘昨天’、‘前天’、具体的星期几以及日期。提供相关代码实现,方便开发者快速理解和集成到项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发中关于时间显示问题(今天/昨天/前天/星期几/具体日期)

以今天为基准,显示 今天/昨天/前天(昨天12:12)
离今天一周之内的显示 星期几(星期四)
离今天一周之外的显示 具体日期(15-09-05 12:33)

为了直观方便,直接上代码,有注释。(都写在ViewController中,需要的自己可以将方法拿出去封装到工具类中)

//  ViewController.m
//  Test
//
//  Created by chenqianfeng on 15/9/15.
//  Copyright (c) 2015年 chenqianfeng. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@",[self format:@"2015年09月1日 12时12分12秒"]);
    NSLog(@"%@",[self format:@"2015年09月10日 12时12分12秒"]);
    NSLog(@"%@",[self format:@"2015年09月14日 12时12分12秒"]);

}
- (NSString *)format:(NSString *)string
{
    NSDateFormatter *inputFormatter= [[NSDateFormatter alloc] init];
    [inputFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] ];
    [inputFormatter setDateFormat:@"yyyy年MM月dd日 HH时mm分ss秒"];
    NSDate*inputDate = [inputFormatter dateFromString:string];

    NSDateFormatter *outputFormatter= [[NSDateFormatter alloc] init];
    [outputFormatter setLocale:[NSLocale currentLocale]];
    [outputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    //get date str
    NSString *str= [outputFormatter stringFromDate:inputDate];
    //str to nsdate
    NSDate *strDate = [outputFormatter dateFromString:str];
    //修正8小时的差时
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSInteger interval = [zone secondsFromGMTForDate: strDate];
    NSDate *endDate = [strDate  dateByAddingTimeInterval: interval];
    //NSLog(@"endDate:%@",endDate);
    NSString *lastTime = [self compareDate:endDate];
//    NSLog(@"lastTime = %@",lastTime);
    return lastTime;
}
-(NSString *)compareDate:(NSDate *)date
{
    NSTimeInterval secondsPerDay = 24 * 60 * 60;
    //修正8小时之差
    NSDate *date1 = [NSDate date];
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSInteger interval = [zone secondsFromGMTForDate: date1];
    NSDate *localeDate = [date1  dateByAddingTimeInterval: interval];
    //NSLog(@"nowdate=%@\nolddate = %@",localeDate,date);
    NSDate *today = localeDate;
    NSDate *yesterday,*beforeOfYesterday;
    //今年
    NSString *toYears;
    toYears = [[today description] substringToIndex:4];
    yesterday = [today dateByAddingTimeInterval: -secondsPerDay];
    beforeOfYesterday = [yesterday dateByAddingTimeInterval: -secondsPerDay];
    // 10 first characters of description is the calendar date:
    NSString *todayString = [[today description] substringToIndex:10];
    NSString *yesterdayString = [[yesterday description] substringToIndex:10];
    NSString *beforeOfYesterdayString = [[beforeOfYesterday description] substringToIndex:10];
    NSString *dateString = [[date description] substringToIndex:10];
    NSString *dateYears = [[date description] substringToIndex:4];
    NSString *dateContent;
    if ([dateYears isEqualToString:toYears]) {//同一年
        //今 昨 前天的时间
        NSString *time = [[date description] substringWithRange:(NSRange){11,5}];
        //其他时间格式:15-09-01 12:12
        NSString *time2 = [[date description] substringWithRange:(NSRange){2,14}];

        if ([dateString isEqualToString:todayString]){
            dateContent = [NSString stringWithFormat:@"今天%@",time];
            return dateContent;
        } else if ([dateString isEqualToString:yesterdayString]){
            dateContent = [NSString stringWithFormat:@"昨天%@",time];
            return dateContent;
        }else if ([dateString isEqualToString:beforeOfYesterdayString]){
            dateContent = [NSString stringWithFormat:@"前天%@",time];
            return dateContent;
        }else{
            if ([self compareDateFromeWorkTimeToNow:[[date description] substringWithRange:(NSRange){5,11}]]) {
                //一周之内除了今天昨天前天之外显示星期
                return [[self class]weekdayStringFromDate:date];
            }else{
                //一周之外的显示日期
                return time2;
            }
        }
    }else{
        return dateString;
    }
}
//传入时间字符与今天比较是否在一周之内
- (BOOL)compareDateFromeWorkTimeToNow:(NSString *)timeStr
{
    NSString *todayStr = [self dateTransformToTimeString];
    int today = [todayStr substringWithRange:(NSRange){3,2}].intValue;
    int workTime = [timeStr substringWithRange:(NSRange){3,2}].intValue;
    if ([[timeStr substringToIndex:2] isEqualToString:[todayStr substringToIndex:2]]) {
        if (today - workTime <= 6) {
            return YES;
        }else{
            return NO;
        }
    }else{
        return NO;
    }
}
//获得当前时间并且转为字符串(截取后的)
- (NSString *)dateTransformToTimeString
{
    //获得当前时间 2014-07-16 07:54:36 +0000(NSDate类)
    NSDate *currentDate = [NSDate date];
    //转为字符串
    NSDateFormatter*df = [[NSDateFormatter alloc]init];//实例化时间格式类
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];//格式化
    //2014-07-16 07:54:36(NSString类)
    NSString *timeString = [df stringFromDate:currentDate];
    timeString = [timeString substringFromIndex:5];
    return timeString;
}
//传入时间返回星期几
+ (NSString*)weekdayStringFromDate:(NSDate*)inputDate
{
    NSArray *weekdays = [NSArray arrayWithObjects: [NSNull null], @"星期日", @"星期一", @"星期二", @"星期三", @"星期四", @"星期五", @"星期六", nil];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];
    [calendar setTimeZone: timeZone];
    NSCalendarUnit calendarUnit = NSWeekdayCalendarUnit;
    NSDateComponents *theComponents = [calendar components:calendarUnit fromDate:inputDate];
    return [weekdays objectAtIndex:theComponents.weekday];
}
@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值