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下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案

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

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

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

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

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

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

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

  7. iOS下的 Fixed BUG

    input 光标位置乱窜 固定式浮层内的输入框光标会发生偏移.即 fixed 定位的容器中输入框光标的位置显示不正确,没有正常地显示在输入框中,而是偏移到了输入框外面 可触发条件 页面body出现滚动 ...

  8. 如何在webapp中做出原生的ios下拉菜单效果

    github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜单 html下拉菜单select在安卓和IOS下表现不一样,iossel ...

  9. 记一次事件委托在 ios 下的兼容 bug

    项目中碰到的兼容类 bug,记录一二. 页面上有几个同类型的控件,点击它们会触发一些事件,很显然,事件委托优于批量绑定.为了图方便,我将 click 事件绑定到了 document.body 上(绑定 ...

随机推荐

  1. 洛谷P2729 饲料调配 Feed Ratios

    P2729 饲料调配 Feed Ratios 36通过 103提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 农夫约翰从来只用调 ...

  2. Android 操作系统的内存回收机制

    参考 http://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/index.html

  3. C#实现文件下载的几种方法

    //WriteFile实现下载 protected void Button2_Click(object sender, EventArgs e) { /* using System.IO; */ st ...

  4. 【EF 4】ORM框架及其流行产品之一EF介绍

    导读:跳进了多租户切换数据库的坑,那么就继续走下去吧.在我们的项目中,是运用EF实现对数据库的操作,那么EF其实是.NET系统中,基于ORM框架的一个产品实现.在java那边,则有Hibernate和 ...

  5. 【Python】django模型models的外键关联使用

    Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...

  6. ibatis 存储过程写法

    <?xml version=)  ORDER BY a.DepId) AS row_n,a.DepId,a.DepName,a.ParentDepId,a.DepCode,a.CustomerS ...

  7. git gc

    git gc 有时候当你运行一些git命令(比如git pull)的时候,会有如下提示: 1 2 Auto packing the repository for optimum performance ...

  8. CentOS学习笔记--目录配置

      Linux目录配置 类Linux的目录看上去差不多,为什么? 以下内容节选自l 鸟哥的 Linux 私房菜 -- 基础学习篇目录  第六章.Linux 的文件权限与目录配置 3. Linux目录配 ...

  9. 无法运行maven项目

    tomcat Server Location 选择 User Tomcat installation 设置CATALINA_HOME环境变量(tomcat start.bat启动不了)1.CATALI ...

  10. POJ C++程序设计 编程题#4:魔兽世界之一:备战

    编程题#4:魔兽世界之一:备战 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...