NSDate 使用 ios时间的秒数

取当前时间的秒数

NSTimeInterval time [[NSDate date] timeIntervalSince1970];
long long int date (long long int)time;
NSLog(@”date\n%d”, date); //1295322949
//把秒数转化成yyyy-MM-dd hh:mm:ss格式
NSDate *dd [NSDate dateWithTimeIntervalSince1970:date];
NSLog(@”d:%@”,dd); //2011-01-18 03:55:49 +0000

//给一个时间秒数,取出对应的时间
NSString *s @”1295355600000″; //对应21:00
NSDate *d [NSDate dateWithTimeIntervalSince1970:[s doubleValue]/1000];
NSLog(@”dddd:%@”,d); //2011-01-18 13:00:00 +0000
NSDateFormatter *formatter1 [[NSDateFormatter alloc] init];
[formatter1 setDateFormat:@"HH:mm"];
NSString *showtimeNew [formatter1 stringFromDate:d];
NSLog(@”showtimeNew:%@”,showtimeNew); //21:00 比d的时间 +8小时
[formatter1 release];


1. 创建或初始化可用以下方法
用于创建NSDate实例的类方法有
(id)date;
返回当前时间
(id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
返回以当前时间为基准,然后过了secs秒的时间
(id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;
返回以2001/01/01 GMT为基准,然后过了secs秒的时间
(id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
返回以1970/01/01 GMT为基准,然后过了secs秒的时间
(id)distantFuture;
返回很多年以后的未来的某一天。(比如你需要一个比现在(Now)晚(大)很长时间的时间值,则可以调用该方法。测试返回了4000/12/31 16:00:00)
(id)distantPast;
返回很多年以前的某一天。(比如你需要一个比现在(Now)早(小)大很长时间的时间值,则可以调用该方法。测试返回了公元前0001/12/31 17:00:00)

用于创建NSDate实例的实例方法有
(id)addTimeInterval:(NSTimeInterval)secs;
返回以目前的实例中保存的时间为基准,然后过了secs秒的时间

用于初始化NSDate实例的实例方法有
(id)init;
初始化为当前时间。类似date方法
初始化为以2001/01/01 GMT为基准,然后过了secs秒的时间。类似dateWithTimeIntervalSinceReferenceDate:方法
(id)initWithTimeInterval:(NSTimeInterval)secs sinceDate:(NSDate *)refDate;
初始化为以refDate为基准,然后过了secs秒的时间
(id)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;
初始化为以当前时间为基准,然后过了secs秒的时间

2. 日期之间比较可用以下方法
(BOOL)isEqualToDate:(NSDate *)otherDate;
与otherDate比较,相同返回YES
(NSDate *)earlierDate:(NSDate *)anotherDate;
与anotherDate比较,返回较早的那个日期
(NSDate *)laterDate:(NSDate *)anotherDate;
与anotherDate比较,返回较晚的那个日期
(NSComparisonResult)compare:(NSDate *)other;
该方法用于排序时调用:
当实例保存的日期值与anotherDate相同时返回NSOrderedSame
当实例保存的日期值晚于anotherDate时返回NSOrderedDescending
当实例保存的日期值早于anotherDate时返回NSOrderedAscending

3. 取回时间间隔可用以下方法
(NSTimeInterval)timeIntervalSinceDate:(NSDate *)refDate;
以refDate为基准时间,返回实例保存的时间与refDate的时间间隔
(NSTimeInterval)timeIntervalSinceNow;
以当前时间(Now)为基准时间,返回实例保存的时间与当前时间(Now)的时间间隔
(NSTimeInterval)timeIntervalSince1970;
以1970/01/01 GMT为基准时间,返回实例保存的时间与1970/01/01 GMT的时间间隔
(NSTimeInterval)timeIntervalSinceReferenceDate;
以2001/01/01 GMT为基准时间,返回实例保存的时间与2001/01/01 GMT的时间间隔
(NSTimeInterval)timeIntervalSinceReferenceDate;
以2001/01/01 GMT为基准时间,返回当前时间(Now)与2001/01/01 GMT的时间间隔

4. 将时间表示成字符串
(NSString *)description;
以YYYY-MM-DD HH:MM:SS ±HHMM的格式表示时间。(其中 “±HHMM” 表示与GMT的存在多少小时多少分钟的时区差异。比如,若时区设置在北京,则 “±HHMM” 显示为 “+0800″)


将时区设成本地:

    NSTimeZone *zone = [NSTimeZonesystemTimeZone];

    NSInteger interval = [zone secondsFromGMTForDate:date];

    NSDate *localeDate = [date addTimeInterval:interval];


NSString和NSDate互转需要用到NSDateFormatter,设置一下timezone和format即可,直接上代码




NSString和NSDate互转需要用到NSDateFormatter,设置一下timezone和format即可,直接上代码

[cpp]  view plain copy
  1. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
  2. NSTimeZone *timeZone = [NSTimeZone localTimeZone];  
  3.   
  4. [formatter setTimeZone:timeZone];  
  5. [formatter setDateFormat : @"M/d/yyyy h:m a"];  
  6.   
  7. NSString *stringTime = @"12/5/2011 3:4 am";  
  8.   
  9. NSDate *dateTime = [formatter dateFromString:stringTime];   
  10.   
  11. NSLog(@"%@", dateTime);//打印2011-12-04 19:04:00 +0000,这里+0000表示时区  
  12.   
  13. NSDate *dateNow = [NSDate date];  
  14.   
  15. NSLog(@"%@", dateNow);//打印2011-08-17 08:26:57 +0000,这里+0000表示时区  
  16.   
  17. [formatter setDateFormat : @"yyyy年M月d日 H点m分"];  
  18.   
  19. NSLog(@"%@", [formatter stringFromDate:dateNow]);//打印2011年8月17日 16点26分  

关于format中的每个字母代表的意思,可以到这里去查: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/df100103.html#//apple_ref/doc/uid/TP40007972-SW1 ,拉到中间的部分即可看到


今天发现用NSDateFormatter的stringFromDate方法将服务器传过来的背景时间的NSDate转换成NSString会相差8小时,调查发现,可能是因为stringFromDate时,将date当做格林威治时间了,返回的String变成本地时区。所以差了8个小时。

我用的方式是:

1 NSDateFormatter* formate=[[NSDateFormatter alloc]init];
2     [formate setDateFormat:DATE_FORMAT_SPLIT];
3     [formate setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
4     [formate stringFromDate:date]
这样再转换时就不会出现时区问题了。

当然,好像方法不是唯一的。



1.4.2   日期和时间

我们使用NSDate类比较日期,并计算两个日期之间的日期和时间间隔:

可以用当前的日期和时间创建一个NSDate:

 
 
  1. NSDate *myDate = [NSDate date]; 

可以创建一个NSDate,表示从现在开始的24小时:

 
 
  1. NSTimeInterval secondsPerDay =  
  2.  
  3. 4*60*60;  
  4. NSDate *tomorrow = [NSDate  
  5. -ateWithTimeIntervalSinceNow:  
  6. -econdsPerDay]; 

可以使用如下代码,根据一个已有的日期创建一个日期:

 
 
  1. NSTimeInterval secondsPerDay =  
  2.  
  3. 4*60*60;  
  4. NSDate *now = [NSDate date];  
  5. NSDate *yesterday = [now  
  6. -ddTimeInterval:-secondsPerDay]; 

可以比较两个日期是否完全相等:

 
 
  1. BOOL sameDate =  
  2. -date1 isEqualToDate:date2]; 

或者,判断一个日期是在另一个日期之前还是之后,使用如下代码:

 
 
  1. NSDate *earlierDate =  
  2. -date1 earlierDate:date2];  
  3. NSDate *laterDate =  
  4. -date1 laterDate:date2];  

可以计算两个日期之间相隔多少秒:

 
 
  1. NSTimeInterval secondsBetweenDates =  
  2.  
  3.  
  4. -date2 timeIntervalSinceDate:  
  5. -ate1]; 

或者可以计算现在和将来的一个日期之间相隔多少秒:

 
 
  1. NSTimeInterval secondsUntilTomorrow  
  2.  [tomorrow timeIntervalSinceNow]; 

通过使用NSCalendar类,我们可以更加容易地创建NSDate对象。

例如,创建一个表示2010年6月1日的日期,使用如下代码:

 
 
  1. NSDateComponents *comp =  
  2. -[NSDateComponents alloc] init];  
  3. [comp setMonth:06];  
  4. [comp setDay:01];  
  5. [comp setYear:2010];  
  6. NSCalendar *myCal = [[NSCalendar  
  7. -lloc] initWithCalendarIdentifier:  
  8. -SGregorianCalendar];  
  9. NSDate *myDate =  
  10. -myCal dateFromComponents:comp]; 

类似地,从一个已有的日期中获取日期、月份和年份等组成部分,使用如下代码:

 
 
  1. unsigned units = NSMonthCalendarUnit 
  2. - NSDayCalendarUnit |  
  3. NSYearCalendarUnit;  
  4. NSDate *now =[NSDate date];  
  5. NSCalendar *myCal = [[NSCalendar  
  6. -lloc] initWithCalendarIdentifier:  
  7. -SGregorianCalendar];  
  8. NSDateComponents *comp = [myCal  
  9. -omponents:units fromDate:now];  
  10. NSInteger month = [comp month];  
  11. NSInteger day = [comp day];  
  12. NSInteger year = [comp year]; 

当通过已有的日期创建日期的时候,创建日历也会变得更容易一些,因为我们不必把所有内容转换为秒以及从秒转换过来。

例如,重新编写前面创建的一个表示明天日期的例子,使用如下的代码:

 
 
  1. NSDate *now = [NSDate date];  
  2. NSDateComponents *comp =  
  3. -[NSDateComponents alloc] init];  
  4. [comp setDay:01];  
  5. NSCalendar *myCal = [[NSCalendar  
  6. -lloc] initWithCalendarIdentifier:  
  7. -SGregorianCalendar];  
  8. NSDate *tomorrow = [myCal  
  9. -ateByAddingComponents:comp  
  10. -oDate:now options:0]; 

当我们想要把可供人类阅读的日期和时间显示给用户,NSDate本身并不是特别容易实现。因此,我们通常会使用NSDateFormatter。

使用NSDateFormatter获得表示当前日期的一个字符串,使用如下代码:

 
 
  1. NSDate *now = [NSDate date];  
  2. NSDateFormatter *formatter =  
  3. -[NSDateFormatter alloc] init];  
  4. [formatter setDateStyle:  
  5. -SDateFormatterMediumStyle];  
  6. NSString *friendlyDate =  
  7. -formatter stringFromDate:now]; 

获取当前时间,可以使用如下代码:

 
 
  1. NSDate *now = [NSDate date];  
  2. NSDateFormatter *formatter =  
  3. -[NSDateFormatter alloc] init];  
  4. [formatter setTimeStyle:  
  5. -SDateFormatterMediumStyle];  
  6. NSString *friendlyTime =  
  7. -formatter stringFromDate:now]; 

表1-2给出了5种预定义的格式化样式。

最后,也可以使用一个日期格式的dateFormat属性来手动地设置样式:

 
 
  1. NSDate *now = [NSDate date];  
  2. NSDateFormatter *formatter =  
  3. -[NSDateFormatter alloc] init];  
  4. [formatter setDateFormat:  
  5. -"yyyy-mm-dd"];  
  6. NSString *friendlyDate =  
  7. -formatter stringFromDate:now]; 

注意formatter的格式大小写必须严格按照文档提供的,否则会出现错误!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值