iOS之时间

李勇
2023-12-01

iOS之时间:

1NSDate时间戳,即代表某一个时间点

2NSCalendar提供了不同历法的时间信息,支持日历的计算

3NSDateFomatter在特定历法下的时间表示,基本用于不同历法的时间转换,默认是阳历NSDatecomponents是获取可读时间表示方式,比如等,和NSCalendar一起用,默认是阳历;还可以表示一个时间段,比如几周,几月,几年;还可以获取在当前历法下某一时间点的前或者后一个时间点

4、NSLoclale 根据不同的语言环境,返回不同的语言的时间数据,默认是当前系统设置的语言格式


上代码:

1NSDateComponents的用法

(1)根据一个时间点,获取他在特定日历下的所有信息
//  先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//  通过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置需要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等)
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]];
NSLog(@"year(年份): %i", dateComponents.year);
NSLog(@"quarter(季度):%i", dateComponents.quarter);
NSLog(@"month(月份):%i", dateComponents.month);
NSLog(@"day(日期):%i", dateComponents.day);
NSLog(@"hour(小时):%i", dateComponents.hour);
NSLog(@"minute(分钟):%i", dateComponents.minute);
NSLog(@"second(秒):%i", dateComponents.second);

//  Sunday:1, Monday:2, Tuesday:3, Wednesday:4, Friday:5, Saturday:6
NSLog(@"weekday(星期):%i", dateComponents.weekday);

//  苹果官方不推荐使用week
NSLog(@"week(该年第几周):%i", dateComponents.week);
NSLog(@"weekOfYear(该年第几周):%i", dateComponents.weekOfYear);
NSLog(@"weekOfMonth(该月第几周):%i", dateComponents.weekOfMonth);
(2)设置一个时间点,获取他在特定日历下的所有信息,或者前后的时间信息
//  先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//  定义一个NSDateComponents对象,设置一个时间点
NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init];
[dateComponentsForDate setDay:6];
[dateComponentsForDate setMonth:5];
[dateComponentsForDate setYear:2004];

//  根据设置的dateComponentsForDate获取历法中与之对应的时间点
//  这里的时分秒会使用NSDateComponents中规定的默认数值,一般为0或1。
NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc];
//  定义一个NSDateComponents对象,设置一个时间段
NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init];
[dateComponentsForDate setDay:6];

//  在当前历法下,获取6天后的时间点
NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0];
(3)获取这两个时间点的时差
//  先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//  根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0];
NSLog(@"number of years:%i", dateComponents.year);

(4)
//  当前时间对应的月份中有几天
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
//  当前时间对应的月份中有几周(前面说到的firstWeekday会影响到这个结果)
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
//  当前时间对应的周是当前年中的第几周
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self];
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]];
//  当前时间对应的周是当前月中的第几周
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self];
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];



2NSDate的一些用法,因为有时区概念timeZone,所以有时候 — 时间与字符串的转化挺麻烦的

有一个小技巧就是,将NSDateFormatter存进当前线程中,这样不用每次新建NSDateFormatter

对象了,因为每次新建NSDateFormatter对象是非常耗时间的,容易阻塞主线程

(1)时间转字符串  时区如果没有则默认是当前系统设置的时区
+ (NSString *)stringFromDate:(NSDate *)date andFormat:(NSString *)format withTimeZone:(NSTimeZone *)timeZone
{
    if (! date) {
        date = [NSDate date];
    }
    if (! format) {
        format = @"yyyyMMdd HH:mm:ss";
    }
    
    NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary;
    NSMutableDictionary *dateFormatters = nil;
    
    @synchronized(threadDict)
    {
        dateFormatters = threadDict[@"dateFormatters"];
        if(dateFormatters == nil)
        {
            dateFormatters = [NSMutableDictionary dictionary];
            threadDict[@"dateFormatters"] = dateFormatters;
        }
    }
    
    NSDateFormatter *formatter = dateFormatters[format];
    if(formatter == nil)
    {
        formatter = [[NSDateFormatter alloc] init];
        formatter.timeZone = [NSTimeZone systemTimeZone];
        if([timeZone isKindOfClass:[NSTimeZone class]])
        {
            formatter.timeZone = timeZone;
        }
        
        formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
        formatter.dateFormat = format;
        dateFormatters[format] = formatter;
    }
         
    return [formatter stringFromDate:date];
}
时间转零时区的字符串
+ (NSString *)stringFromDate:(NSDate *)date andFormat:(NSString *)format
{
    return [self stringFromDate:date andFormat:format withTimeZone:nil];
}
时间转中国时区的字符串
+ (NSString *)stringFromDate:(NSDate *)date andGMT8Format:(NSString *)format
{
    return [self stringFromDate:date andFormat:format withTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];
}
字符串转时间,时区为当前系统设置的时区
+ (NSDate *)dateFromString:(NSString *)dateStr withFormatter:(NSString *)format
{
    NSAssert(dateStr && format, nil);
    
    NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary;
    NSMutableDictionary *dateFormatters = nil;
    
    @synchronized(threadDict)
    {
        dateFormatters = threadDict[@"dateFormatters"];
        if(dateFormatters == nil)
        {
            dateFormatters = [NSMutableDictionary dictionary];
            threadDict[@"dateFormatters"] = dateFormatters;
        }
    }
    
    NSDateFormatter *formatter = dateFormatters[format];
    if(formatter == nil)
    {
        formatter = [[NSDateFormatter alloc] init];
        formatter.timeZone = [NSTimeZone systemTimeZone];
        
        formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
        formatter.dateFormat = format;
        dateFormatters[format] = formatter;
    }
    
    return [formatter dateFromString:dateStr];
}
//  字符串转时间 直接转 零时区
+ (NSDate *)dateZeroFromString:(NSString *)dateStr withFormatter:(NSString *)format
{
NSAssert(dateStr && format, nil);
NSDateFormatter *formatter = nil;
if(formatter == nil)
{
formatter = [[NSDateFormatter alloc] init];
formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
formatter.dateFormat = format;
}
return [formatter dateFromString:dateStr];
}




 类似资料: