NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间

Dates 
        NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能。Date对象是不可改变的。 
        如果你要创建date对象并表示当前日期,你可以alloc一个NSDate对象并调用init初始化: 
C代码  
NSDate *now = [[NSDate alloc] init];    
  
          或者使用NSDate的date类方法来创建一个日期对象。如果你需要与当前日期不同的日期,你可以使用NSDate的initWithTimeInterval...或dateWithTimeInterval...方法,你也可以使用更复杂的calendar或date components对象。

创建一定时间间隔的NSDate对象: 
C代码  
NSTimeInterval secondsPerDay = 24 * 60 * 60;    
    
NSDate *tomorrow = [[NSDate alloc] initWithTimeIntervalSinceNow:secondsPerDay];    
    
NSDate *yesterday = [[NSDate alloc] initWithTimeIntervalSinceNow:-secondsPerDay];    
    
[tomorrow release];    
[yesterday release];    
  
        使用增加时间间隔的方式来生成NSDate对象: 
C代码  
NSTimeInterval secondsPerDay = 24 * 60 * 60;    
    
NSDate *today = [[NSDate alloc] init];    
NSDate *tomorrow, *yesterday;    
    
tomorrow = [today dateByAddingTimeInterval: secondsPerDay];    
yesterday = [today dateByAddingTimeInterval: -secondsPerDay];    
    
[today release];

如果要对NSDate对象进行比较,可以使用isEqualToDate:, compare:, laterDate:和 earlierDate:方法。这些方法都进行精确比较,也就是说这些方法会一直精确比较到NSDate对象中秒一级。例如,你可能比较两个日期,如果他们之间的间隔在一分钟之内则认为这两个日期是相等的。在这种情况下使用,timeIntervalSinceDate:方法来对两个日期进行比较。下面的代码进行了示例: 
C代码  
if (fabs([date2 timeIntervalSinceDate:date1]) < 60) ...

NSCalendar & NSDateComponents

日历对象封装了对系统日期的计算,包括这一年开始,总天数以及划分。你将使用日历对象对绝对日期与date components(包括年,月,日,时,分,秒)进行转换。

NSCalendar定义了不同的日历,包括佛教历,格里高利历等(这些都与系统提供的本地化设置相关)。NSCalendar与NSDateComponents对象紧密相关。

你可以通过NSCalendar对象的currentCalendar方法来获得当前系统用户设置的日历。 
C代码  
NSCalendar *currentCalendar = [NSCalendar currentCalendar];    
NSCalendar *japaneseCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSJapaneseCalendar];    
NSCalendar *usersCalendar = [[NSLocale currentLocale] objectForKey:NSLocaleCalendar];

usersCalendar和currentCalendar对象是相等的,尽管他们是不同的对象。

你可以使用NSDateComponents对象来表示一个日期对象的组件——例如年,月,日和小时。如果要使一个NSDateComponents对象有意义,你必须将其与一个日历对象相关联。下面的代码示例了如何创建一个NSDateComponents对象: 
C代码  
NSDateComponents *components = [[NSDateComponents alloc] init];    
    
[components setDay:6];    
[components setMonth:5];    
[components setYear:2004];    
    
NSInteger weekday = [components weekday]; // Undefined (== NSUndefinedDateComponent)

要将一个日期对象解析到相应的date components,你可以使用NSCalendar的components:fromDate:方法。此外日期本身,你需要指定NSDateComponents对象返回组件。 
C代码  
NSDate *today = [NSDate date];    
    
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    
NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];    
    
NSInteger day = [weekdayComponents day];    
NSInteger weekday = [weekdayComponents weekday];

同样你也可以从NSDateComponents对象来创建NSDate对象:  
C代码  
NSDateComponents *components = [[NSDateComponents alloc] init];    
    
[components setWeekday:2]; // Monday    
[components setWeekdayOrdinal:1]; // The first Monday in the month    
[components setMonth:5]; // May    
[components setYear:2008];    
    
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    
NSDate *date = [gregorian dateFromComponents:components];

为了保证正确的行为,您必须确保使用的组件在日历上是有意义的。指定“出界”日历组件,如一个-6或2月30日在公历中的日期值产生未定义的行为。

你也可以创建一个不带年份的NSDate对象,这样的操作系统会自动生成一个年份,但在后面的代码中不会使用其自动生成的年份。 
C代码  
NSDateComponents *components = [[NSDateComponents alloc] init];    
    
[components setMonth:11];    
[components setDay:7];    
    
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    
NSDate *birthday = [gregorian dateFromComponents:components];

下面的示例显示了如何从一个日历置换到另一个日历: 
C代码  
NSDateComponents *comps = [[NSDateComponents alloc] init];    
    
[comps setDay:6];    
[comps setMonth:5];    
[comps setYear:2004];    
    
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    
NSDate *date = [gregorian dateFromComponents:comps];    
    
[comps release];    
[gregorian release];    
    
NSCalendar *hebrew = [[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar];    
    
NSUInteger unitFlags = NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;    
    
NSDateComponents *components = [hebrew components:unitFlags fromDate:date];    
    
NSInteger day = [components day]; // 15    
NSInteger month = [components month]; // 9    
NSInteger year = [components year]; // 5764

历法计算

在当前时间加上一个半小时: 
C代码  
NSDate *today = [[NSDate alloc] init];    
    
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];    
    
[offsetComponents setHour:1];    
[offsetComponents setMinute:30];    
    
// Calculate when, according to Tom Lehrer, World War III will end    
NSDate *endOfWorldWar3 = [gregorian dateByAddingComponents:offsetComponents toDate:today options:0];

获得当前星期中的星期天(使用格里高利历): 
C代码  
NSDate *today = [[NSDate alloc] init];    
    
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    
// Get the weekday component of the current date    
NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:today];    
    
/*   
Create a date components to represent the number of days to subtract from the current date.   
   
The weekday value for Sunday in the Gregorian calendar is 1, so subtract 1 from the number of days to subtract from the date in question.  (If today is Sunday, subtract 0 days.)   
*/    
    
NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];    
    
[componentsToSubtract setDay: 0 - ([weekdayComponents weekday] - 1)];    
    
NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract toDate:today options:0];    
    
/*   
Optional step:   
beginningOfWeek now has the same hour, minute, and second as the original date (today).   
   
To normalize to midnight, extract the year, month, and day components and create a new date from those components.   
*/    
    
NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate: beginningOfWeek];    
    
beginningOfWeek = [gregorian dateFromComponents:components];

如何可以计算出一周的第一天(根据系统的日历设置): 
C代码  
NSDate *today = [[NSDate alloc] init];    
    
NSDate *beginningOfWeek = nil;    
    
BOOL ok = [gregorian rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate: today];

获得两个日期之间的间隔: 
C代码  
NSDate *startDate = ...;    
NSDate *endDate = ...;    
    
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    
NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;    
    
NSDateComponents *components = [gregorian components:unitFlags fromDate:startDate toDate:endDate options:0];    
    
NSInteger months = [components month];    
NSInteger days = [components day];

使用Category来计算同一时代(AD|BC)两个日期午夜之间的天数: 
C代码  
@implementation NSCalendar (MySpecialCalculations)    
    
-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate {    
     NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:startDate];    
    
     NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:endDate];    
    
     return endDay-startDay;    
}    
    
@end

使用Category来计算不同时代(AD|BC)两个日期的天数: 
C代码  
@implementation NSCalendar (MyOtherMethod)    
    
-(NSInteger) daysFromDate:(NSDate *) startDate toDate:(NSDate *) endDate {    
    
     NSCalendarUnit units=NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;    
    
     NSDateComponents *comp1=[self components:units fromDate:startDate];    
     NSDateComponents *comp2=[self components:units fromDate endDate];    
    
     [comp1 setHour:12];    
     [comp2 setHour:12];    
    
     NSDate *date1=[self dateFromComponents: comp1];    
     NSDate *date2=[self dateFromComponents: comp2];    
    
     return [[self components:NSDayCalendarUnit fromDate:date1 toDate:date2 options:0] day];    
}    
    
@end

判断一个日期是否在当前一周内(使用格里高利历): 
C代码  
-(BOOL)isDateThisWeek:(NSDate *)date {    
    
     NSDate *start;    
     NSTimeInterval extends;    
    
     NSCalendar *cal=[NSCalendar autoupdatingCurrentCalendar];    
     NSDate *today=[NSDate date];    
    
     BOOL success= [cal rangeOfUnit:NSWeekCalendarUnit startDate:&start interval: &extends forDate:today];   
    
     if(!success)    
        return NO;    
    
     NSTimeInterval dateInSecs = [date timeIntervalSinceReferenceDate];    
     NSTimeInterval dayStartInSecs= [start timeIntervalSinceReferenceDate];    
    
     if(dateInSecs > dayStartInSecs && dateInSecs < (dayStartInSecs+extends)){    
          return YES;    
     }    
     else {    
          return NO;    
     }    
}

来源:http://blog.csdn.net/lingedeng/article/details/6996599

1、获取当前时间

C代码  
NSDateFormatter*formatter = [[NSDateFormatteralloc] init];  
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];  
NSString *locationString=[formatter stringFromDate: [NSDate date]];

另外的方法:

C代码  
-(NSString *)getDate  
{  
NSDateFormatter*formatter = [[NSDateFormatteralloc] init];  
[formatter setDateFormat:@"yyyy-MM-dd EEEE HH:mm:ss a"];  
NSString *locationString=[formatter stringFromDate: [NSDate date]];  
[formatter release];  
return locationString;  
}

//大写的H日期格式将默认为24小时制,小写的h日期格式将默认为12小时 
//不需要特别设置,只需要在dataFormat里设置类似"yyyy-MMM-dd"这样的格式就可以了

日期格式如下: 
y  年  Year  1996; 96  
M  年中的月份  Month  July; Jul; 07  
w  年中的周数  Number  27  
W  月份中的周数  Number  2  
D  年中的天数  Number  189  
d  月份中的天数  Number  10  
F  月份中的星期  Number  2  
E  星期中的天数  Text  Tuesday; Tue  
a  Am/pm 标记  Text  PM  
H  一天中的小时数(0-23)  Number  0  
k  一天中的小时数(1-24)  Number  24  
K  am/pm 中的小时数(0-11)  Number  0  
h  am/pm 中的小时数(1-12)  Number  12  
m  小时中的分钟数  Number  30  
s  分钟中的秒数  Number  55  
S  毫秒数  Number  978  
z  时区  General time zone  Pacific Standard Time; PST; GMT-08:00  
Z  时区  RFC 822 time zone  -0800

2、NSTimer定时器的基本操作方式 
NSTimer是Cocoa中比较常用的定时器类,基本操作如下: 
handleTimer方法可以自行定义。在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次。

C代码  
- (void) handleTimer: (NSTimer *) timer  
{  
   //在这里进行处理  
}   
NSTimer *timer;  
timer = [NSTimer scheduledTimerWithTimeInterval: 0.5 target: self selector: @selector(handleTimer:)userInfo: nil repeats: YES];

3、定时器 
设置定时器下面显示的定时器将在一秒钟后触发,并一直重复直到定时器被禁用。定时器每次激活时,就会调用发送选择器消息的目标来进行初始化。回调方法带有一个参数,就是定时器本身.要禁用一个定时器,给它发送invalidate消息,这将释放定时器对象并把它从当前运行循环中删除。 
C代码  
NSTime *timer ;  
timer = [NSTimer scheduledTimerWithTimeInterval:1.0target:self selector:@selector(handlTimer:) userInfo:nilrepeats:YES];  
  
- (void)handleTimer:(NSTimer *)timer{  
printf("timer count: %d", count++);  
if(count > 3)  
{  
[timer invalidate];  
}

来源: http://blog.csdn.net/imekong/article/details/7041312

1. 使用 NSTimeZone 取得世界各地时间的方法 
下列程式码将示范,如何利用 NSTimeZone 取得世界上已知的时区名称,并且透过这些名称来获得当地时间,如果在系统时间的取得上有任何疑问,可以参考取得 iOS 系统日期与星期的方法一文,其程式码如下。 
C代码  
//取得目前已知的所有地里名称  
NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];   
  
//取得本地目前时间  
NSDate *date = [NSDate date];   
  
for(NSString *name in timeZoneNames) {   
NSTimeZone *timezone = [[NSTimeZone alloc] initWithName:name];   
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];   
  
//设定时间格式  
[formatter setDateFormat:@"YYYY-MM-d HH:mm:ss"];   
  
//设定时区  
[formatter setTimeZone:timezone];   
  
//时间格式正规化并做时区校正  
NSString *correctDate = [formatter stringFromDate:date];  
  
NSLog(@"地点:%@ 当地时间:%@",[timezone name], correctDate);   
  
[formatter release];   
[timezone release];   
}

由于能取得的地点相当多,下图只是部份的执行结果。

来源: http://furnacedigital.blogspot.com/2011/10/nstimezone.html

2. 取得 iOS 系统日期与星期的方法

在之前的文章中已经说明如何取得 Device 里的 iOS 系统时间,在此将在示范如何使用 NSDate 取得系统的日期与星期,请看以下程式码。 
C代码  
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
NSDate *date = [NSDate date];   
  
//正规化的格式设定  
[formatter setDateFormat:@"YYYY-MM-dd' 'EEEE"];  
  
//正规化取得的系统时间并显示  
dateLabel.text = [formatter stringFromDate:date];

当然 NSFormatter 能正规化的格式不只这些,想知道其他的参数可以参考关于 NSDateFormatter 的二三事一文。

3. 取得 iOS 系统时间的方法

如何取得 Device 里的 iOS 系统时间,可以参考以下程式码。 
C代码  
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
NSDate *date = [NSDate date];  
  
//正规化的格式设定  
[formatter setTimeStyle:NSDateFormatterFullStyle];  
  
//正规化取得的系统时间并显示  
timeLabel.text = [formatter stringFromDate:date];  
  
[formatter release];

在时间格式正规化的部份也有多种样式可供选择,其样式如下。 
C代码  
[formatter setTimeStyle:NSDateFormatterFullStyle];  
[formatter setTimeStyle:NSDateFormatterLongStyle];  
[formatter setTimeStyle:NSDateFormatterMediumStyle];  
[formatter setTimeStyle:NSDateFormatterShortStyle];

最后,如果要让时间与现实时间同步可以考虑实做计时器 Timer 来解决此问题,详细的设定方式可参阅 Timer / 计时器的基本使用方法。

来源:http://furnacedigital.blogspot.com/2011/01/blog-post.html#more

4. Timer / 计时器的基本使用方法

这里介绍 Timer 的基本使用方法,首先设定 Timer 的相关的参数,程式码如下。(View-based Template) 
C代码  
//自行定义的函式,用来设定使用Timer/计时器的相关参数  
-(void)initializeTimer {  
  
//设定Timer触发的频率,每秒30次  
float theInterval = 1.0/30.0;  
fpsLabel.text = [NSString stringWithFormat:@"%0.3f", theInterval];  
  
//正式启用Timer,selector是设定Timer触发时所要呼叫的函式  
[NSTimer scheduledTimerWithTimeInterval:theInterval   
target:self  
selector:@selector(countTotalFrames:)   
userInfo:nil  
repeats:YES];  
}

上述程式码,已经完成 Timer 的基本设定,而下列程式码则是 Timer 触发时所呼叫的函式写法。 
C代码  
-(void)countTotalFrames:(NSTimer *)theTimer {  
frameCount ++;  
framesLabel.text = [NSString stringWithFormat:@"%d", frameCount];  
}

最后,别忘记在程式进入点这边要呼叫自行定义的 initializeTimer 函式,才能让 Timer 运作。

iOS下日期的处理(世界标准时转本地时间)的更多相关文章

  1. iOS下日期的处理

    NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 Dates         NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能.Date对象是 ...

  2. 关于IOS下日期格式分隔符 - 、 /的问题

    之前我们项目有一个低价日历,服务端下发的时间格式为: "2014-07-21 09:45:12"  然后一直出不了数据,后来发现. IOS下无论chrome.safari还是Uc如 ...

  3. ios 对日期的处理(包括计算昨天时间、明天时间)

    NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 Dates NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能.Date对象是不可改变的. 如 ...

  4. C#令人迷惑的DateTime:世界标准时间还是本地时间?

    先来看一段代码: 复制内容到剪贴板程序代码 DateTime time = DateTime.Parse("2013-07-05 00:00:00");Console.WriteL ...

  5. 周记2——ios的日期格式bug

    转眼又到了周末,转眼又要上班,转眼...大概这就是一眼万年的意思吧. 这周继续IM(即时聊天),项目用的是LayIM移动端改装的,仅仅“借用”了一个聊天窗口.由于是内嵌App的页面,自然少不了Andr ...

  6. iOS下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案

    做touchweb开发的时候,做头疼的是,电脑上面时候好的,有些手机上面也是好的,个别手机和浏览器出现问题,对于这些,只能慢慢调试,找问题. 今天说一下比较老的IOS的问题,那就是"iOS下 ...

  7. 移动端踩坑之旅-ios下fixed、软键盘相关问题总结

    最近一个项目掉进了移动端的大坑,包括ios下fixed布局,h5唤起键盘等问题,作为一个B端程序员,弱项就是浏览器的兼容性和移动端的适配(毕竟我们可以要求使用chrome),还好这次让我学习了一下相关 ...

  8. javascript的倒计时功能中newData().getTime()在iOS下会报错问题解决

    javascript的倒计时功能中newData().getTime()在iOS下会报错问题解决 在做移动端时间转化为时间戳时,遇到了一个问题,安卓手机上访问时,能拿到时间戳,从而正确转换时间,而在i ...

  9. iOS下JSON反序列化开源库

    iOS下JSON字符串反序列化成对象.在正式的项目中比較常见.例如以下几个经常使用开源库.能够依据个人喜好任选其一: 1. JSONModel: https://github.com/icanzilb ...

随机推荐

  1. msql_DDL_创建table

    • 语法: create table 表名(• 列名1 列类型 [<列的完整性约束>],• 列名2 列类型 [<列的完整性约束>],• ... ... ); • PRIMARY ...

  2. 转: DH密钥交换和ECDH原理

    转自:http://www.tuicool.com/articles/em6zEb DH密钥交换和ECDH原理 时间 2013-06-24 18:50:55  CSDN博客 原文  http://bl ...

  3. 转 【O2O案例】汽车后市场垂直化电子商务:平业模式解析

    核心提示:一.商业模式简介.汽车后市场垂直化电子商务是我在2010年初开始筹划,起因是在淘宝工作期间运营汽车类目后遇到很多问题无决,由于 一.商业模式简介. 汽车后市场垂直化电子商务是我在2010年初 ...

  4. H5入门-xhtml+css2-第01节

    <!-- 声明版本号,DOCTYPE html是html5版本 --> <!DOCTYPE html> <!-- 声明网页语言 en-英文 zh-中文 zh-cn中文 - ...

  5. innerHTML与innerText的PK

    一.innerText属性用来定义对象所要输出的文本,在本例中innerText把对象it中的文本"您喜欢看微微一笑很倾城吗?"变成了"超级喜欢!"(语句it. ...

  6. css子元素的margin-top为何会影响父元素

    详细内容请点击 这个问题困惑了很久,虽然没有大碍早就摸出来怎么搞定它,但始终不明白原因出在哪里,如果只是IE有问题我也不会太在意,可问题是所有上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出 ...

  7. R语言快速入门

    R语言是针对统计分析和数据科学的功能全面的开源语言,R的官方网址:http://www.r-project.org/  在Windows环境下安装R是很方便的 R语言的两种运行模式:交互模式和批处理模 ...

  8. Part 10 AngularJS sort rows by table header

    Here is what we want to do 1. The data should be sorted when the table column header is clicked 2. T ...

  9. Part 89 to 91 Talking about pass the parameters in thread

    Part 89   ParameterizedThreadStart delegate Use ParameterizedThreadStart delegate to pass data to th ...

  10. 22----2013.06.29---HTML--html介绍.超链接和图片,表格,表单,表单标签,meta,复习当天内容

    01 HTML HTML :Hypertext Markup Language   超文本标记语言(类似于 裸奔的人.) 作用:向用户展示信息. CSS: Cascading 层叠样式表(类似于 人的 ...