免费开源的iOS开发学习平台

NSDate类(日期时间)基本使用

在开发中有时候会需要使用到日期或者时间,苹果也为开发者们提供了一个日期类以供使用,这就是NSDate。NSDate对象用来表示一个具体的时间点,它存储的是世界标准时间,所以在使用的时候可能会需要根据不同的时区将时间转换为本地时间。

获取日期与时间

NSDate类中提供了date方法,用来获取当前标准时区的时间,在通常情况下,我们需要本时区的时间,例如,在中国就需要东八区的时间。因此,通常需要把标准时间转换成本地时间。下方的示例代码中演示了如何获取当前标准时间以及如何把标准时间转换为本地时间。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //获取时间
        NSDate *date = [NSDate date];
        //打印当前标准时间
        NSLog(@"国际标准时间: %@", date);
        /*将当前世界标准时间转换成本地时间*/
        // 获取系统当前时区
        NSTimeZone *zone = [NSTimeZone systemTimeZone];
        // 获取当前时区与格林尼治时间的间隔
        NSInteger interval = [zone secondsFromGMTForDate:date];
        // 获取本地时间
        NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:interval];
        NSLog(@"当前时区时间: %@", localDate);
    }
    return 0;
}

运行结果如下,中国位于东八区和国际标准时间相差8个小时。

日期格式转换

默认情况下,通过NSDate获取的日期时间格式为:yyyy-MM-dd HH:mm:ss,我们有时喜欢更换为其他形式的日期格式,比如我们更加习惯把日期显示为“2016年12月29日 11:07:32”这种形式,此时,我们就需要借助NSDateFormatter类,来对日期格式进行转换。在使用NSDateFormatter类进行日期转换之前,需要设置日期的格式,有如下关键字需要注意,特别需要关注的是大小写严格区分。

/* 格式化格式:
     y 年
     M 月
     d 日
     H \ h 时 (24小时制 \ 12小时制)
     m 分
     s 秒
*/
  • NSDate转NSString时,我们需要使用NSDateFormatter类的stringFromDate方法
- (NSString *)stringFromDate:(NSDate *)date;
  • NSString转NSDate时,我们需要使用NSDateFormatter类的dateFromString方法
- (nullable NSDate *)dateFromString:(NSString *)string;

下方的示例代码中,演示了如何改变日期的显示形式以及日期与字符串之间的相互转换。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //获取时间
        NSDate *date = [NSDate date];
        //打印当前标准时间
        NSLog(@"国际标准时间: %@", date);
        /*将当前世界标准时间转换成本地时间*/
        // 获取系统当前时区
        NSTimeZone *zone = [NSTimeZone systemTimeZone];
        // 获取当前时区与格林尼治时间的间隔
        NSInteger interval = [zone secondsFromGMTForDate:date];
        // 获取本地时间
        NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:interval];
        NSLog(@"当前时区时间: %@", localDate);
        
        /*日期格式转换*/
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        //设置日期格式,注意大小写严格区分
        df.dateFormat =  @"yyyy年MM月dd日 HH:mm:ss";
        // 将日期按照格式器设置的格式转化为字符串
        NSString *date2string = [df stringFromDate:date];
        NSLog(@"日期转字符串:%@", date2string);
        // 将格式器格式的日期字符串转换成日期对象
        NSDate *string2date = [df dateFromString:date2string];
        NSLog(@"字符串转日期:%@", string2date);
    }
    return 0;
}

运行结果:

其他常用操作

除了创建NSDate日期对象以及对日期对象的格式进行转换之外,NSDate类中还有如下几个方法也相对常用。

  • 比较两个时间对象的先后,可以使用earlierDate以及laterDate方法*
- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;
  • 比较两个时间的间隔,可以使用timeIntervalSinceDate:方法,同时由于程序运行耗时的原因,会有微小的误差;
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
  • 比较两个日期是否相等,可以使用isEqualToDate:方法.
- (BOOL)isEqualToDate:(NSDate *)otherDate;

下方的示例代码中,演示了日期对象之间进行各种比较操作。

void dateOperation () {
    NSDate *date1 = [NSDate date];
    NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:10];
    
    //比较两个时间的先后
    NSDate *tempDate = [[NSDate alloc] init];
    // 返回比较早的那个时间
    tempDate = [date1 earlierDate:date2];
    NSLog(@"earlierDate : %@", tempDate);
    // 返回比较晚的那个时间
    tempDate = [date1 laterDate:date2];
    NSLog(@"laterDate : %@", tempDate);
    
    //比较两个时间的间隔(程序运行耗时的原因,会有微小的误差)
    NSTimeInterval timeInterval = [date2 timeIntervalSinceDate:date1];
    NSLog(@"interval = %f", timeInterval);
    
    // 比较两个日期是否相等
    if ([date1 isEqualToDate:date2]) {
        NSLog(@"date1 与 date2 相同");
    } else {
        NSLog(@"date1 与 date2 不同");
    }
}

运行结果:

示例代码

https://github.com/99ios/4.6