NSDate、NSTimeInterval、NSDateFormatter、NSLocale 、NSTimeZone、NSDateComponents详解

本文深入探讨了NSDate的使用方法及世界时间、UTC、GMT之间的关系。解释了如何在iOS中处理不同时间标准间的转换,并提供了NSDateFormatter的具体应用实例。

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

================NSDate的使用,世界时间、UTC、GMT的理解==============

一、世界时间、UTC、GMT的理解

NSDate时差这篇博客很好,让我对时区做到了大致理解:世界时间和GMT、UTC时间并不冲出,世界时间只是从经度上把时间划分成了24时区,其本初子午线还在英国伦敦;UTC与GMT并没有很大的区别,只是比GMT精准一些,对于普通人无差别。==同时这篇博客说明了如何将GMT时间转换为本地时间,需要注意的是时间通过NSDateFormatter转换为字符串默认就是本地时间,但是直接将时间通过其description函数转换的字符串还是时间所在的时区

从ios4.1开始[NSDate date]获取的是GMT时间,由于北京位于本初子午线东边,且相差8个时区,所以[NSDate date]这个时间加上8个小时才是北京时间。


下面是我对ios中时间的一点认知:

1、[NSDate date]使用的是格林威治时区;time转化为date,date是格林威治时间;格式string转化为date,date是格林威治时间;linux的date函数得出的也是格林威治时间==所以date没有时区的概念,date就是0时区的时间。

2、NSDateFormatter将date转化为字符串时默认使用本地时区;NSDateFormatter将date转化为字符串时认为传入的date的时间是格林威治时间,所以转换之前需要获得格林威治的date。

3、给出的“格式字符串时间”一定要是本地时间,因为其转换为date时函数会将其当作本地时间;不要将date进行时区转换,比如将date加上8小时变成对应北京的date,因为转化为字符串时函数的date参数为格林威治时间。

4、过多使用NSDateFormatter将影响程序的性能,且程序中NSDateFormatter对象的时间格式基本一致,所以使用NSDateFormatter的时候尽量使用单例模式。

5、北京时间在iOS的timeZone对照表里面并没有,中国标准时间在里面存的是上海时间,如NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];


二、NSDate的使用

//NSString转NSDate

NSString *dateString = @"2016-06-01 18:00:00";

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"YYYY-MM-d HH:mm:ss"];

NSDate *date = [formatter dateFromString:dateString];

这里的转换会根据本地时区转换为GMT(格林威治标准时间)


//计算两个时区之间的时间差

NSTimeZone *timeZone = [[NSTimeZone alloc] init];

timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];

NSTimeInterval interval = [timeZone secondsFromGMT];

NSDate *GMTDate = [date dateByAddingTimeInterval:-interval];

//注:北京时间在iOS的timeZone对照表里面并没有,中国标准时间在里面存的是上海时间,也就是上面的Asia/Shanghai,因为是转换到GMT所以interval前面加了负号


===================================================




======================NSTimeInterval======================

NSTimeInterval: 时间戳,以double为单位

===================================================





======================NSDateFormatter=====================

NSDateFormatter类用于格式化NSDate对象,支持本地化的信息。该类对象有三个设置时间格式的函数,如下:

- (void)setDateStyle:(NSDateFormatterStyle)style;

- (void)setTimeStyle:(NSDateFormatterStyle)style;

- (void)setDateFormat:(NSString *)string;(常用)

setDateStyle和setTimeStyle可同时设置,但不能和setDateFormat共存,只可选其一

NSDateFormatterStyle系统选项包含的Style:

{

    NSDateFormatterNoStyle,

    NSDateFormatterShortStyle,     // “11/23/37” or “3:30pm”.

    NSDateFormatterMediumStyle,     //“Nov 23, 1937”.or “3:30:32pm”.   

    NSDateFormatterLongStyle,     //“November 23, 1937” or “3:30:32pm”.  GMT+08:00

    NSDateFormatterFullStyle     //“Tuesday, April 12, 1952 AD” or “3:30:42pm PST”.


}


NSDateFormatter的格式串详解:

a: AM/PM (上午/下午)

A: 0~86399999 (一天的第A微秒)


c/cc: 1~7 (一周的第一天, 周天为1)

ccc: Sun/Mon/Tue/Wed/Thu/Fri/Sat (星期几简写)

cccc: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday (星期几全拼)


d: 1~31 (月份的第几天, 带0)

D: 1~366 (年份的第几天,带0)


e: 1~7 (一周的第几天, 带0)

E~EEE: Sun/Mon/Tue/Wed/Thu/Fri/Sat (星期几简写)

EEEE: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday (星期几全拼)


F: 1~5 (每月的第几周, 一周的第一天为周一)


g: Julian Day Number (number of days since 4713 BC January 1) 未知

G~GGG: BC/AD (Era Designator Abbreviated) 未知

GGGG: Before Christ/Anno Domini 未知


h: 1~12 (0 padded Hour (12hr)) 带0的时, 12小时制

H: 0~23 (0 padded Hour (24hr))  带0的时, 24小时制


k: 1~24 (0 padded Hour (24hr) 带0的时, 24小时制

K: 0~11 (0 padded Hour (12hr)) 带0的时, 12小时制

         

L/LL: 1~12 (0 padded Month)  第几月

LLL: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec 月份简写

LLLL: January/February/March/April/May/June/July/August/September/October/November/December 月份全称

         

m: 0~59 (0 padded Minute) 分钟

M/MM: 1~12 (0 padded Month) 第几月

MMM: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec

MMMM: January/February/March/April/May/June/July/August/September/October/November/December

         

q/qq: 1~4 (0 padded Quarter) 第几季度

qqq: Q1/Q2/Q3/Q4 季度简写

qqqq: 1st quarter/2nd quarter/3rd quarter/4th quarter 季度全拼

Q/QQ: 1~4 (0 padded Quarter) 同小写

QQQ: Q1/Q2/Q3/Q4 同小写

QQQQ: 1st quarter/2nd quarter/3rd quarter/4th quarter 同小写


s: 0~59 (0 padded Second) 秒数

S: (rounded Sub-Second) 未知

         

u: (0 padded Year) 未知

         

v~vvv: (General GMT Timezone Abbreviation) 常规GMT时区的编写

vvvv: (General GMT Timezone Name) 常规GMT时区的名称

         

w: 1~53 (0 padded Week of Year, 1st day of week = Sunday, NB: 1st week of year starts from the last Sunday of last year) 一年的第几周, 一周的开始为周日,第一周从去年的最后一个周日起算

W: 1~5 (0 padded Week of Month, 1st day of week = Sunday) 一个月的第几周

         

y/yyyy: (Full Year) 完整的年份

yy/yyy: (2 Digits Year)  2个数字的年份

Y/YYYY: (Full Year, starting from the Sunday of the 1st week of year) 这个年份未知干嘛用的

YY/YYY: (2 Digits Year, starting from the Sunday of the 1st week of year) 这个年份未知干嘛用的

         

z~zzz: (Specific GMT Timezone Abbreviation) 指定GMT时区的编写


zzzz: (Specific GMT Timezone Name) Z: +0000 (RFC 822 Timezone) 指定GMT时区的名称



eg:

NSString lastModifiedString = @"Mon, 06 Jun 2011 12:47:05 GMT";

 NSDateFormatter *df = [[NSDateFormatter alloc] init];  

 df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";

 df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];  

 df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];  

NSDate date = [df dateFromString:lastModifiedString];  


设置上下午显示格式:

NSDateFormatter* formatter = [[[NSDateFormatteralloc] init] autorelease];

[formatter setDateFormat:dateFormatterString];

[formatter setAMSymbol:@"am"];    //

[formatter setPMSymbol:@"pm"];

[formatter stringFromDate:date];


NSDateFormatter的使用可参考:NSDateFormatter格式详细列表一览

===================================================





=======================NSLocale========================

NSLocale用于指定用户的语言环境,使用户在修改手机的语言环境后显示不发生变化,常与NSDateFormatter配合使用。这个类一般用不着,了解即可。

其使用可参考:iOS时间那点事-NSLocale

===================================================






======================NSTimeZone=======================

NSDate *date = [NSDate date];

    NSLog(@"date:%@",date);

    //系统时区

    NSTimeZone *zone = [NSTimeZone systemTimeZone];

    NSData *data = [zone data];

    NSLog(@"data:%@",data);

    //时间缩写

    NSString *abbStr = [zone abbreviation];

    NSLog(@"abbStr:%@",abbStr);

    //当地时区

    NSTimeZone *localTime = [NSTimeZonelocalTimeZone];

    NSLog(@"localTime:%@",localTime);

    //和格林尼治时间差

    NSInteger timeOff = [zone secondsFromGMT];

    //视察转化

    NSDate *timeOffDate = [date dateByAddingTimeInterval:timeOff];

    NSLog(@"timeOffDate:%@",timeOffDate);

    //所有地区名称

    NSArray *zoneArrs = [NSTimeZone knownTimeZoneNames];

    NSLog(@"zoneArrs:%@",zoneArrs);

    //遍历

    for (NSString *names in zoneArrs) {

        //时区

        NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:names];

        //设置格式

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

        [dateFormatter setDateStyle:kCFDateFormatterFullStyle];

        [dateFormatter setTimeStyle:kCFDateFormatterFullStyle];

        [dateFormatter setTimeZone:timeZone];

        NSString *string = [dateFormatter stringFromDate:date];

        NSLog(@"string:%@,[timeZone name]:%@",string,[timeZone name]);

        [dateFormatter release];

        [timeZone release];

    }

==================================================





======================NSDateComponents====================

NSDateComponents是日历时间的表示,目的是便于人类阅读。

通过NSCalendar对象可以将NSDate对象转换为NSDateComponents对象,注意NSDateComponents对象使用的是本地时区。

其详细使用请参考ios时间那点事--NSCalendar NSDateComponents

                                NSCalendar使用

===================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值