IOS开发中的时间与日期(上)

主要有以下几个类:

NSDate:表示一个具体的绝对的时间点。

NSTimeZone:表示时区信息。

NSLocale:本地化信息。

NSDate

NSDate表示公历(阳历)的格林尼治(G.M.T.)时间。


初始化方法:

1,- (instancetype)init

默认的初始化方法,返回当前时间,也可以直接调用+ (instancetype)date方法

NSDate *date = [[NSDate alloc] init];

//NSDate *date = [NSDate date];

NSLog(@"%@",date);

打印的结果是:2017-03-24 01:47:29 +0000  (打印的时间是格林尼治标准时间,不是我们所在的东八区时间)


2,- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs

以当前时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs方法

NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:-88];

NSLog(@"%@",date);

假如当前时间为:2017-03-24 02:11:37 +0000,打印的结果是:2017-03-24 02:10:09 +0000


3,- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs

以1970-01-01 00:00:00时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs

NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:-20];

NSLog(@"%@",date);

打印的结果是:1969-12-31 23:59:40 +0000


4,- (instancetype)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti

以2001-01-01 00:00:00时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;

NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:20];

NSLog(@"%@",date);

打印的结果是:2001-01-01 00:00:20 +0000


5,- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date

以参数date基准时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date

NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

NSLog(@"%@",currentDate);

NSDate *date = [[NSDate alloc] initWithTimeInterval:20 sinceDate:currentDate];

NSLog(@"%@",date);

打印的结果是:currentDate:1970-01-01 00:00:20 +0000,    date:1970-01-01 00:00:40 +0000


6,+(NSDate)distantPast与+(NSDate)distantFuture

这两个是类方法,分别返回一个极早的时间点和一个极晚的时间点

NSDate *PastDate = [NSDate distantPast];

NSDate *futureDate = [NSDate distantFuture];

NSLog(@"%@-%@",PastDate,futureDate);

打印的结果:PastDate:0000-12-30 00:00:00 +0000    futureDate:4001-01-01 00:00:00 +0000



NSDate的常用对象方法:

1,- (instancetype)dateByAddingTimeInterval:(NSTimeInterval)ti

返回以当前NSDate对象为基准,偏移多少秒后得到的新NSDate对象

NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

NSLog(@"%@",currentDate);

NSDate *date = [currentDate dateByAddingTimeInterval:20];

NSLog(@"%@",date);

打印的结果:currentDate:1970-01-01 00:00:20 +0000    date :1970-01-01 00:00:40 +0000,这个方法的用法与- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date相似。


2,- (BOOL)isEqualToDate:(NSDate *)otherDate

将当前日期对象与参数传递的日期对象进行比较,根据是否相同返回BOOL值

NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

NSDate *secondDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:-20];

BOOL result = [firstDate isEqualToDate:secondDate];

NSLog(@"%d",result);


3,- (NSDate *)earlierDate:(NSDate *)anotherDate方法与- (NSDate *)laterDate:(NSDate *)anotherDate方法

两个日期对象比较,返回较早/较晚的那个对象。

NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

NSDate *secondDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:-20];

//  NSDate *result = [firstDate earlierDate:secondDate];

NSDate *result = [firstDate laterDate:secondDate];

NSLog(@"%@",result);


4,- (NSComparisonResult)compare:(NSDate *)other

比较两个日期对象的大小,返回值是NSComparisonResult枚举类型。

{NSOrderedAscending (升序), NSOrderedSame(相同) ,NSOrderedDescending(降序)}

NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

NSDate *secondDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:-20];

NSComparisonResult result = [firstDate compare:secondDate];

NSLog(@"%ld",result);


5,- (NSTimeInterval)timeIntervalSince1970方法,- (NSTimeInterval)timeIntervalSinceReferenceDate方法,- (NSTimeInterval)timeIntervalSinceNow方法,- (NSTimeInterval)timeIntervalSinceDate:(NSDate*)anotherDate

四个方法的含义分别是:返回当前对象时间与1970-01-01 00:00:00的相隔秒数,返回当前对象时间与2001-01-01 00:00:00的相隔秒数,返回当前时间对象与现在系统时间的相隔秒数,返回当前对象时间与参数传递的对象时间的相隔秒数,

NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSinceNow:-20];

NSDate *date = [[NSDate alloc] init];

NSTimeInterval resultNow = [currentDate timeIntervalSinceNow];

NSTimeInterval result1970 = [currentDate timeIntervalSince1970];

NSTimeInterval result2001 = [currentDate timeIntervalSinceReferenceDate];

NSTimeInterval result = [currentDate timeIntervalSinceDate:date];

NSLog(@"%f+++%f+++%f+++%f",resultNow,result1970,result2001,result);

打印结果为:-20.000006+++1490326647.182058+++512019447.182058+++-20.000003


NSTimeZone

NSTimeZone表示时区信息。 iOS中的时区表示方法:GMT+0800 ,GMT-0800  (+:东区 ,-:西区 ,08:小时数, 00:分钟数)。 GMT+0800 就表示 比GMT早8小时0分钟的时区。

初始化方法:


1,- (nullable instancetype)initWithName:(NSString *)tzName;

根据时区名称初始化,也可以直接调用+ (nullable instancetype)timeZoneWithName:(NSString *)tzName,返回一个时区对象。

NSTimeZone *zone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];

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

NSLog(@"%@",zone);

打印结果为:Asia/Shanghai (GMT+8) offset 28800

另外可以使用+ (NSArray *)knownTimeZoneNames方法,返回所有的时区名称。

NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];

NSLog(@"%@",timeZoneNames);


2,+ (nullable instancetype)timeZoneWithAbbreviation:(NSString *)abbreviation

根据时区名称缩写初始化,例如HKT(香港标准时间)

NSTimeZone *zone = [NSTimeZone timeZoneWithAbbreviation:@"HKT"];

NSLog(@"%@",zone);

打印结果为:Asia/Hong_Kong (GMT+8) offset 28800

另外可以使用+ (NSDictionary*)abbreviationDictionary方法,返回所有的时区名称缩写。

NSDictionary *dict = [NSTimeZone abbreviationDictionary];

NSLog(@"%@",dict);


注意:第1和第2个初始化方法,参数也可以直接传入时区,例如东八区(GMT+0800)

NSTimeZone *zone = [NSTimeZone timeZoneWithAbbreviation:@"GMT+0800"];

NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"GMT+0800"];


3,+ (NSTimeZone *)systemTimeZone

返回系统的时区

NSTimeZone *zone = [NSTimeZone systemTimeZone];

NSLog(@"%@",zone);

打印结果:Asia/Shanghai (GMT+8) offset 28800          ( 28800代表相对于GMT时间偏移的秒数,即8个小时,(8*60*60))


4,+ (NSTimeZone *)localTimeZone

返回本地的时区, 它与系统时区的区别在于,本地时区可以修改,系统时区不能修改。

[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];

NSTimeZone *localZone = [NSTimeZone localTimeZone];

NSTimeZone *systemZone = [NSTimeZone systemTimeZone];

NSLog(@"%@====%@",localZone,systemZone);

打印结果:Local Time Zone (America/New_York (GMT-4) offset -14400 (Daylight))====Asia/Shanghai (GMT+8) offset 28800


5,+ (id)timeZoneForSecondsFromGMT:(NSInteger)seconds

根据零时区的秒数偏移返回一个新时区对象

NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:28800];

NSLog(@"%@",zone);

打印结果:GMT+0800 (GMT+8) offset 28800 为东八区。


NSTimeZone常用对象方法与类方法:


1. - (NSString *)name 与方法 - (NSString *)abbreviation

返回时区对象的名称或缩写

NSTimeZone *zone = [NSTimeZone localTimeZone];

NSString *strZoneName = [zone name];

NSString *strZoneAbbreviation = [zone abbreviation];

NSLog(@"name is %@",strZoneName);

NSLog(@"abbreviation is %@",strZoneAbbreviation);

打印:name is Asia/Shanghai    和    abbreviation is GMT+8


2, - (NSInteger)secondsFromGMT

得到当前时区与零时区的间隔秒数

NSTimeZone *zone = [NSTimeZone systemTimeZone];

NSInteger seconds = [zone secondsFromGMT];

NSLog(@"%zd",seconds);




NSLocale

NSLocale类的的主要作用是用来封装本地化相关的各种信息,包括语言,货币类型,数字,日期格式等等。

初始化方法:



1,+ (id)currentLocale 与方法 + (id)autoupdatingCurrentLocale

返回当前客户端的本地化信息,

NSLocale *locale = [NSLocale currentLocale];

NSString *localeStr = [locale localeIdentifier];

NSLog(@"locale:%@",localeStr);

打印:locale: zh_CN

2,- (instancetype)initWithLocaleIdentifier:(NSString *)string

用本地标示符初始 本地化信息,例如zh_CN标示中国大陆

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

NSString *localeStr = [locale localeIdentifier];

NSLog(@"locale:%@",localeStr);

打印:locale: zh_CN

另外可以使用+ (NSArray *)availableLocaleIdentifiers方法,返回所有的可用标识符。

NSArray * availableLocaleIdentifiers = [NSLocale availableLocaleIdentifiers];

NSLog(@"%@",availableLocaleIdentifiers);


NSLoale常用对象方法与类方法:


1,

// 获取所有已知合法的国家代码数组列表

[NSLocale ISOCountryCodes] ;

// 获取所有已知合法的ISO货币代码数组列表

[NSLocale ISOCurrencyCodes] ;

// 获取所有已知合法的ISO语言代码数组列表

[NSLocale ISOLanguageCodes] ;


2,- (id)objectForKey:(id)key

获取本地化对象的具体内容,例如下面的代码返回了当前货币符号:

NSLocale *locale = [NSLocale currentLocale];

//key值参见NSLocale Calendar Keys

NSString *currencySymbol = [locale objectForKey:NSLocaleCurrencySymbol];

NSLog(@"%@",currencySymbol);

打印:¥

上面的方法相当于 -(NSStrng *) currencySymbol;

NSLocale *locale = [NSLocale currentLocale];

NSString *currencySymbol = [locale currencySymbol];

NSLog(@"%@",currencySymbol);

打印结果也是:¥,推荐使用下面这种方式,简单方便,不用Key。


3,获取当前语言的排版方向和字符方向

[NSLocale lineDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];

[NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] ;


4,- (NSString *)displayNameForKey:(id)key value:(id)value

以本地化方式获取国际化信息的显示名称

NSArray * availableLocaleIdentifiers = [NSLocale availableLocaleIdentifiers];

NSLocale *locale = [[NSLocale alloc]

initWithLocaleIdentifier:@"zh_CN"];

for (NSString *identifiers in availableLocaleIdentifiers) {

NSString *str = [locale displayNameForKey:NSLocaleIdentifier

value:identifiers];

NSLog(@"%@--%@",identifiers,str);

}

打印: 

eu--巴斯克文

hr_BA--克罗地亚文(波斯尼亚和黑塞哥维那)

en_CM--英文(喀麦隆)

en_BI--英文(布隆迪)

rw_RW--卢旺达文(卢旺达)

ast--阿斯图里亚思特文

en_SZ--英文(斯威士兰)

he_IL--希伯来文(以色列)

..... ...... ......  一部分


5,监听用户本地化设置的消息

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(localChangedHandler:)

name:NSCurrentLocaleDidChangeNotification object:nil];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • iOS开发中,经常会遇到各种各样的时间问题,8小时时差,时间戳,求时间间隔,农历等等。解决办法网上比比皆是,但大多...
    小李龍彪阅读 6,165评论 1 6
  • 在iOS开发中,经常会遇到各种各样的时间问题,8小时时差,时间戳,求时间间隔,农历等等。解决办法网上比比皆是,但大...
    真巧了_嘿阅读 2,702评论 0 7
  • 24号,三老后裔重访春晖,也有部分嘉宾朋友随同参观。交谈间,一位专家询问可否购得一枚校徽?我问原因,答道值得珍藏。...
    11a0f1bf13fb阅读 333评论 0 0
  • 今天,因为中午的时间比较紧,所以没有评上协会里已经上传的人的分,全部都落在了下午,好累啊,希望大家都打起精神,加油...
    ecc40896f134阅读 202评论 4 1