关于NSData---NSDateFormatter---NSString---NSTimeInterval (IOS开发)

本文介绍了iOS开发中NSData和NSDateFormatter的使用,包括NSData的初始化方法,如时间偏移创建,以及常用方法,如时间间隔计算。同时讲解了NSDateFormatter的日期格式转换,包括自定义日期格式化,Unix时间戳转换等。文中还提供了多个示例代码,帮助理解这些概念。

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

NSData 初始化

    1,返回当前时间

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

    //NSDate *date = [NSDate date];

    

    2,以当前时间的偏移秒数来初始化。以下表示当前时间20秒以后

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

    //NSDate *date = [NSDate dateWithTimeIntervalSinceNow:20];

    

    3,以格林威治时间的偏移秒数来初始化。以下表示格林威治时间往前20秒:1969-12-31 23:59:40 +0000

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

    //NSDate *date = [NSDate dateWithTimeIntervalSince1970:-20];

    

    4,以2001-1-1 0:0:0的偏移秒数来初始化:2001-01-01 00:01:20 +0000

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

    //NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:80];

    

    5,第一个基准时间是2001-01-01 00:00:20 +0000,根据基准时间偏移10秒的结果是2001-01-01 00:00:30 +0000

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

    NSDate *date = [[NSDate alloc] initWithTimeInterval:10 sinceDate:date1];

    //NSDate *date = [NSDate dateWithTimeInterval:10 sinceDate:date1];

    

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

    NSDate *date = [NSDate distantFuture];//distantPast将返回:0001-12-30 00:00:00 +0000

    NSDate *date = [NSDate distantPast];//distantFuture将返回:4001-01-01 00:00:00 +0000

 

NSData 常用方法

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

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

    NSDate *date1 = [date dateByAddingTimeInterval:-20];

    

    2,比较,根据是否相同返回BOOL值

    NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:0];

    NSDate *date2 = [NSDate dateWithTimeInterval:0 sinceDate:date2];

    BOOL isEqual = [date1 isEqualToDate:date3];

    

    3,比较两个NSDate对象,返回较早/较晚的时间点,并以新NSDate对象的形式返回

    NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:0];

    NSDate *date2 = [NSDate dateWithTimeInterval:-50 sinceDate:date];

    NSDate *date3 = [date1 earlierDate:date2];

    NSDate *date4 = [date1 laterDate:date2];

    

    4,将当前对象与参数传递的对象进行比较,如果相同,返回0(NSOrderedSame);对象时间早于参数时间,返回-1(NSOrderedAscending);对象时间晚于参数时间,返回1(NSOrderedDescending)

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

    NSDate *date1 = [NSDate dateWithTimeInterval:-50 sinceDate:date];

    NSInteger result = [date compare:date1];

    

    5,返回当前对象时间与1970-1-1 0:0:0的相隔秒数,也可以这样理解:从1970-1-1 0:0:0开始,经过多少秒到达对象指定时间

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:50];

    NSInteger seconds = [date timeIntervalSince1970];  //返回结果50

    

    6,返回当前对象时间与2001-1-1 0:0:0的相隔秒数,也可以这样理解:从2001-1-1 0:0:0开始,经过多少秒到达对象指定时间

    NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:-30];

    NSInteger seconds = [date timeIntervalSinceReferenceDate];  //返回结果-30

    

    7,返回当前对象时间与客户端时间的相隔秒数,也可以这样理解:从客户端当前时间开始,经过多少秒到达对象指定时间

    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:100];

    NSInteger seconds = [date timeIntervalSinceNow];  //返回了结果99

    

    8,返回当前对象时间与参数传递的对象时间的相隔秒数,也可以这样理解:从参数时间开始,经过多少秒到达对象执行时间

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

    NSDate *date1 = [NSDate dateWithTimeInterval:50 sinceDate:date];

    NSInteger seconds = [date timeIntervalSinceDate:date1];  //将返回结果-50

 

NSDateFormatter 常用方法

    1,自定义日期格式NSDate转NString:

    NSDate * date = [NSDate date];

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

    //设置自定义日期格式

    formatter.dateFormat = @"yyyy-MM-dd a hh:mm:ss.SSS E Z ";

    NSString * dateString = [formatter stringFromDate:date];

    

    2,自定义日期格式NString转NSDate:

    NSString * string = @"2015-12-29 10:18:19";

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

    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    NSDate * date1 = [formatter dateFromString:string];

    

    3,Unix时间戳

    //NSDate转时间戳

    NSInteger seconds = [[NSDate date] timeIntervalSince1970];

    //时间戳转NSDate

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:1451394269];

    

    4,NSDate * -> NSString *

    NSDate *date = [NSDate date];

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

    fmt.dateFormat = @"yyyy年MM月dd号HH:mm:ss";

    NSString *string = [fmt stringFromDate:date];

    

    5,取某个具体数据(年、月、日、时、分、秒)

    NSString *string = @"2015-11-20 09:10:05";

    NSString *month = [string substringWithRange:NSMakeRange(5, 2)];

    

    6,NSString * -> NSDate *

    // 时间字符串

    NSString *string = @"2015-11-20 09:10:05";

    // 日期格式化类

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

    // 设置日期格式(为了转换成功)

    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // NSString * -> NSDate *

    NSDate *date = [fmt dateFromString:string];

    

【举个栗子1】

    //从NSDate *里取具体数据

    // 利用NSCalendar处理日期

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];

    NSInteger hour = [calendar component:NSCalendarUnitHour fromDate:date];

    NSInteger minute = [calendar component:NSCalendarUnitMinute fromDate:date];

    

    

    NSDate *now = [NSDate date];

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;

    NSDateComponents *dateComponent_now = [calendar components:unitFlags fromDate:now];

    NSInteger year_now = [dateComponent_now year];

    NSInteger month_now = [dateComponent_now month];

    NSInteger day_now = [dateComponent_now day];

    NSInteger hour_now = [dateComponent_now hour];

    NSInteger minute_now = [dateComponent_now minute];

    NSInteger second_now = [dateComponent_now second];

 

【举个栗子2】

//时间格式

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

[formatter setDateFormat:@"MMM dd,yyyy HH:mm tt"];

//时间字符串NSDate

NSDate *date = [formatter dateFromString:string];

//NSDate转时间字符串

NSString *dateString = [formatter stringFromDate:date];

//时间转时间戳

NSTimeInterval interval = [date timeIntervalSince1970];

//时间戳转时间

date = [NSDate dateWithTimeIntervalSince1970:interval];

 

【举个栗子3】

  在程序开始或者进入某个界面 ,到结束程序或退出某个界面,获取到这个持续时间.

  并将获取到这个时间转化为时分秒形式表达

-(NSString *)getCurrentTime {

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

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString *dateTime = [formatter stringFromDate:[NSDate date]];

self.startTime = dateTime;

return startTime;

}

date1代表开始时间,在开始计时的地方调用[self getCurrentTime]; 在结束时的方法里写如下代码:

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

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *date1 = [formatter dateFromString:startTime];

NSDate *date2 = [NSDate date];

NSTimeInterval aTimer = [date2 timeIntervalSinceDate:date1];

int hour = (int)(aTimer/3600);

int minute = (int)(aTimer - hour*3600)/60;

int second = aTimer - hour*3600 - minute*60;

NSString *dural = [NSString stringWithFormat:@"%d时%d分%d秒", hour, minute,second];

 

 

【补充——基础知识】

[NSDate date]获取的数据为什么少了8小时?是因为他获取的是零时区的时间,显示的是格林威治的时间: 年-月-日 时:分:秒:+时区,我们在东八区,所以会有8小时的问题。

1.什么是UTC?//世界标准时间,国际协调时间,简称UTC。不属于任意时区。(GMT(Greenwish Mean Time 格林威治平时),这是UTC的民间名称。GMT=UTC。
2.什么是时间戳?就是1970.1.1 00:00:00作为标准,某个时间和他的秒数,并且NSDate必须是0时区的,UTC格式的。
3.时间戳应该是10位,如果碰到了13位的,代表着他计算了毫秒,只要删除剪切前十位就行了

NSDate -> NSString, NSDate转成字符串的文字格式多样,主要依赖DateFormat,可以随意确定DateFormat格式,都能输出。(但是NSString -> NSDate不可以随便的转换,必须要看NSString是什么格式的,然后再去写dateFormat,否则无效)

(注:如果是获取NSString类型的时间,直接通过dateFormate就能转化好,不需要考虑8小时问题!!!)

 

    NSDateFormatter的日期格式如下:

    G -- 纪元

    一般会显示公元前(BC)和公元(AD)

    y -- 

    假如是2013年,那么yyyy=2013,yy=13

    M -- 

    假如是3月,那么M=3,MM=03,MMM=Mar,MMMM=March

    假如是11月,那么M=11,MM=11,MMM=Nov,MMMM=November

    w -- 年包含的周

    假如是1月8日,那么w=2(这一年的第二个周)

    W -- 月份包含的周(与日历排列有关)

    假如是2013年4月21日,那么W=4(这个月的第四个周)

    F -- 月份包含的周(与日历排列无关)

    和上面的W不一样,F只是单纯以7天为一个单位来统计周,例如7号一定是第一个周,15号一定是第三个周,与日历排列无关。

    D -- 年包含的天数

    假如是1月20日,那么D=20(这一年的第20天)

    假如是2月25日,那么D=31+25=56(这一年的第56天)

    d -- 月份包含的天数

    假如是5号,那么d=5,dd=05

    假如是15号,那么d=15,dd=15

    E -- 星期

    假如是星期五,那么E=Fri,EEEE=Friday

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

    H -- 24小时制,显示为0--23

    假如是午夜00:40,那么H=0:40,HH=00:40

    h -- 12小时制,显示为1--12

    假如是午夜00:40,那么h=12:40

    K -- 12小时制,显示为0--11

    假如是午夜00:40,那么K=0:40,KK=00:40

    k -- 24小时制,显示为1--24

    假如是午夜00:40,那么k=24:40

    m -- 分钟

    假如是5分钟,那么m=5,mm=05

    假如是45分钟,那么m=45,mm=45

    s -- 

    假如是5秒钟,那么s=5,ss=05

    假如是45秒钟,那么s=45,ss=45

    S -- 毫秒一般用SSS来显示

    z -- 时区表现形式为GMT+08:00

    Z -- 时区表现形式为+0800

    */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值