Hello, World!

时间与日期(上)

字数统计: 1.8k阅读时长: 8 min
2017/03/24 Share

NSDate

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

初始化方法

  • - (instancetype)init

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

1
2
3
4
5
NSDate *date = [[NSDate alloc] init];

// NSDate *date = [NSDate date]; // 等同于上句

NSLog(@"%@",date);

log信息如下:
2017-03-24 01:47:29 +0000
打印的时间是格林尼治标准时间,不是我们所在的东八区时间。

  • - (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs

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

1
2
3
NSDate *date = [[NSDate alloc] init];
NSDate *date1 = [[NSDate alloc] initWithTimeIntervalSinceNow:-88];
NSLog(@"%@ --> %@", date, date1);

log信息如下:
2017-03-24 02:11:37 +0000 –> 2017-03-24 02:10:09 +0000

  • - (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs

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

1
2
NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:-20];
NSLog(@"%@",date);

log信息如下:
1969-12-31 23:59:40 +0000

  • - (instancetype)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti

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

1
2
3
NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:20];

NSLog(@"%@",date);

log信息如下:
2001-01-01 00:00:20 +0000

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

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

1
2
3
4
5
NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];
NSLog(@"%@",currentDate);

NSDate *date = [[NSDate alloc] initWithTimeInterval:20 sinceDate:currentDate];
NSLog(@"%@",date);

log信息如下:
1970-01-01 00:00:20 +0000
1970-01-01 00:00:40 +0000

  • - (instancetype)dateByAddingTimeInterval:(NSTimeInterval)ti

返回以NSDate对象为基准,偏移多少秒后得到的新NSDate对象。与- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date方法相似。

1
2
3
4
5
NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];
NSLog(@"%@",currentDate);

NSDate *date = [currentDate dateByAddingTimeInterval:20];
NSLog(@"%@",date);

log信息如下:
1970-01-01 00:00:20 +0000
1970-01-01 00:00:40 +0000

  • +(NSDate)distantPast与+(NSDate)distantFuture

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

1
2
3
4
NSDate *PastDate = [NSDate distantPast];
NSDate *futureDate = [NSDate distantFuture];

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

log信息如下:
0000-12-30 00:00:00 +0000 –> 4001-01-01 00:00:00 +0000

常用方法

  • - (BOOL)isEqualToDate:(NSDate *)otherDate

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

1
2
3
4
5
6
NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

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

BOOL result = [firstDate isEqualToDate:secondDate];
NSLog(@"%d",result);

log信息如下:
NO

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

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

1
2
3
4
5
6
NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

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

NSDate *result1 = [firstDate earlierDate:secondDate];
NSDate *result2 = [firstDate laterDate:secondDate];
  • - (NSComparisonResult)compare:(NSDate *)other

比较两个日期对象的大小,返回值是NSComparisonResult枚举类型。
{NSOrderedAscending (升序), NSOrderedSame(相同) ,NSOrderedDescending(降序)}

1
2
3
4
5
NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

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

NSComparisonResult result = [firstDate compare:secondDate];
  • - (NSTimeInterval)timeIntervalSince1970
  • - (NSTimeInterval)timeIntervalSinceReferenceDate
  • - (NSTimeInterval)timeIntervalSinceNow
  • - (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate

返回当前对象时间与1970-01-01 00:00:00的相隔秒数
返回当前对象时间与2001-01-01 00:00:00的相隔秒数
返回当前时间对象与现在系统时间的相隔秒数
返回当前对象时间与参数传递的对象时间的相隔秒数

1
2
3
4
5
6
7
8
9
10
11
12
NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSinceNow:-20];

NSTimeInterval resultNow = [currentDate timeIntervalSinceNow];

NSTimeInterval result1970 = [currentDate timeIntervalSince1970];

NSTimeInterval result2001 = [currentDate timeIntervalSinceReferenceDate];

NSDate *date = [[NSDate alloc] init];
NSTimeInterval result = [currentDate timeIntervalSinceDate:date];

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

log信息如下:
-20.000006+++1490326647.182058+++512019447.182058+++-20.000003

NSTimeZone

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

初始化方法

  • - (nullable instancetype)initWithName:(NSString *)tzName

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

1
2
3
4
5
NSTimeZone *zone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];

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

NSLog(@"%@",zone);

log信息如下:
Asia/Shanghai (GMT+8) offset 28800

时区名称也可以以GMT+0800形式设置。例如[NSTimeZone timeZoneWithName:@”GMT+0800”];

  • + (NSArray *)knownTimeZoneNames

返回所有的时区名称。

1
2
3
NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];

NSLog(@"%@",timeZoneNames);

log信息如下:
“Africa/Abidjan”,
“Africa/Accra”,
“Africa/Addis_Ababa”,
“Africa/Algiers”,
… 等等

  • + (nullable instancetype)timeZoneWithAbbreviation:(NSString *)abbreviation

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

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

NSLog(@"%@",zone);

log信息如下:
Asia/Hong_Kong (GMT+8) offset 28800

时区名称也可以以GMT+0800形式设置。例如[NSTimeZone timeZoneWithAbbreviation:@”GMT+0800”];

  • + (NSDictionary *)abbreviationDictionary

返回所有的时区名称缩写。

1
2
3
NSDictionary *dict = [NSTimeZone abbreviationDictionary];

NSLog(@"%@",dict);

log信息如下:
ADT = “America/Halifax”;
AKDT = “America/Juneau”;
AKST = “America/Juneau”;
… 等等

常用方法

  • + (NSTimeZone *)systemTimeZone
  • + (NSTimeZone *)localTimeZone
  • + (NSTimeZone *)defaultTimeZone

返回系统时区
返回本地时区
返回默认时区,它与以上二者的区别在于,默认时区可以修改,本地和系统时区不能修改。

1
2
3
4
5
6
NSTimeZone *localZone = [NSTimeZone localTimeZone];
NSTimeZone *systemZone = [NSTimeZone systemTimeZone];
[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
NSTimeZone *defaultZone = [NSTimeZone defaultTimeZone];

NSLog(@"%@ --> %@ --> %@", localZone, systemZone, defaultZone);

log信息如下:
Local Time Zone (Asia/Shanghai (GMT+8) offset 28800) –>
Asia/Shanghai (GMT+8) offset 28800 –>
America/New_York (EST) offset -18000

  • + (id)timeZoneForSecondsFromGMT:(NSInteger)seconds

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

1
2
3
NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:28800];

NSLog(@"%@",zone);

log信息如下:
GMT+0800 (GMT+8) offset 28800
为东八区

  • *- (NSString \)name **
  • - (NSString *)abbreviation

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

1
2
3
4
5
6
NSTimeZone *zone = [NSTimeZone localTimeZone];
NSString *strZoneName = [zone name];
NSString *strZoneAbbreviation = [zone abbreviation];

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

log信息如下:
name is Asia/Shanghai
abbreviation is GMT+8

  • - (NSInteger)secondsFromGMT

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

1
2
3
4
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger seconds = [zone secondsFromGMT];

NSLog(@"%zd",seconds);

log信息如下:
28800

NSLocale

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

初始化方法

  • - (instancetype)initWithLocaleIdentifier:(NSString *)string

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

1
2
3
4
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
NSString *localeStr = [locale localeIdentifier];

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

log信息如下:
zh_CN

  • + (NSArray *)availableLocaleIdentifiers

返回所有的可用标识符。

1
2
3
NSArray *availableLocaleIdentifiers = [NSLocale availableLocaleIdentifiers];

NSLog(@"%@",availableLocaleIdentifiers);

log信息如下:
eu,
“hr_BA”,
“en_CM”,

ast,
“en_SZ”,
“he_IL”,
…等等

常用方法

  • + (id)currentLocale
  • + (id)autoupdatingCurrentLocale

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

1
2
3
4
NSLocale *locale = [NSLocale currentLocale];
NSString *localeStr = [locale localeIdentifier];

NSLog(@"%@",localeStr);

log信息如下:
en_US

  • [NSLocale ISOCountryCodes]

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

  • [NSLocale ISOCurrencyCodes]

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

  • [NSLocale ISOLanguageCodes]

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

  • -(NSStrng *) currencySymbol

返回当前货币符号

1
2
3
4
NSLocale *locale = [NSLocale currentLocale];
NSString *currencySymbol = [locale currencySymbol];

NSLog(@"%@",currencySymbol);

log信息如下:
$

  • + (NSLocaleLanguageDirection)lineDirectionForLanguage:

获取当前语言的排版方向

  • + (NSLocaleLanguageDirection)characterDirectionForLanguage:

获取当前语言的字符方向

  • - (NSString *)displayNameForKey:(id)key value:(id)value

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

1
2
3
4
5
6
7
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);
}

log信息如下:
eu–巴斯克语
hr_BA–克罗地亚语(波斯尼亚和黑塞哥维那)
en_CM–英语(喀麦隆)
en_BI–英语(布隆迪)
en_AE–英语(阿拉伯联合酋长国)
…等等

  • 监听用户本地化设置的消息
1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(localChangedHandler:) name:NSCurrentLocaleDidChangeNotification object:nil];
CATALOG
  1. 1. NSDate
    1. 1.1. 初始化方法
    2. 1.2. 常用方法
  2. 2. NSTimeZone
    1. 2.1. 初始化方法
    2. 2.2. 常用方法
  3. 3. NSLocale
    1. 3.1. 初始化方法
    2. 3.2. 常用方法