看来非常多网上关于日期的处理,今天、昨天、前天、后天、一周等,满心欢喜的拿着去验证结果总是不尽如人意,看别别人的代码看的脑涨。自己就写一个简单的,自己来用,以后用其它的方法,我会在完好,再次记录。以方便以后查阅

--宋飞祥    2014.7.19

直接上代码,非常easy理解:

#import <Foundation/Foundation.h>

@interface MyCutomNSDateDeal : NSObject

+(NSInteger)timeZoneOffset;
+(NSInteger)preDayOfTheDate_start:(NSDate *)date;
+(NSInteger)preDayOfTheDate_end:(NSDate *)date;
+(NSInteger)nextDayOfTheDate_start:(NSDate *)date;
+(NSInteger)nextDayOfTheDate_end:(NSDate *)date; @end
#import "MyCutomNSDateDeal.h"

@implementation MyCutomNSDateDeal

+(NSInteger)timeZoneOffset
{
NSDate *date = [NSDate date];
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger offset = [zone secondsFromGMTForDate:date];
return offset;
}
/**
* 依据给出的日期,返回该日期的前一天的起点(相对于日期起点。seconds的计数)
*
* @param date 日期
*
* @return 返回的是seconds计数,相对于日历系统起始至该日期前一天的起点(就是0点)
*/
+(NSInteger)preDayOfTheDate_start:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:date];
[components setHour:-[components hour]-24];
[components setMinute:-[components minute]];
[components setSecond:-[components second]];
NSDate *date1 = [cal dateByAddingComponents:components toDate:date options:0]; return [date1 timeIntervalSince1970]+[self timeZoneOffset];
} /**
* 依据给出的日期。返回该日期的前一天的终点(也就是给出日期的起点)
*
* @param date 给定的日期
*
* @return 返回的是seconds计数
*/
+(NSInteger)preDayOfTheDate_end:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:date];
[components setHour:-[components hour]];
[components setMinute:-[components minute]];
[components setSecond:-[components second]];
NSDate *date1 = [cal dateByAddingComponents:components toDate:date options:0]; return [date1 timeIntervalSince1970]+[self timeZoneOffset];
} +(NSInteger)nextDayOfTheDate_start:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:date];
[components setHour:-[components hour]+24];
[components setMinute:-[components minute]];
[components setSecond:-[components second]];
NSDate *date1 = [cal dateByAddingComponents:components toDate:date options:0]; return [date1 timeIntervalSince1970]+[self timeZoneOffset]; } +(NSInteger)nextDayOfTheDate_end:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:date];
[components setHour:-[components hour]+ 2*24];
[components setMinute:-[components minute]];
[components setSecond:-[components second]];
NSDate *date1 = [cal dateByAddingComponents:components toDate:date options:0]; return [date1 timeIntervalSince1970]+[self timeZoneOffset]; } //+(NSInteger)preWeekOfTheDate_ @end

使用例如以下:

这里我取得date 为当天的,用户能够换成自己想要的相对日期就可以!!

 NSDate *today = [NSDate date];
NSLog(@"today ::::: %@",today);
NSInteger today_int = [MyCutomNSDateDeal preDayOfTheDate_start:today];
NSDate *per_start = [NSDate dateWithTimeIntervalSince1970:today_int];
NSLog(@"per_start _:_ %@",per_start);
NSDate *per_end = [NSDate dateWithTimeIntervalSince1970:[MyCutomNSDateDeal preDayOfTheDate_end:today]];
NSLog(@"per_end -:- %@",per_end);
NSDate *next_start = [NSDate dateWithTimeIntervalSince1970:[MyCutomNSDateDeal nextDayOfTheDate_start:today]];
NSDate *next_end = [NSDate dateWithTimeIntervalSince1970:[MyCutomNSDateDeal nextDayOfTheDate_end:today]];
NSLog(@"next_start === %@",next_start);
NSLog(@"next_end === %@",next_end);

打印结果例如以下:

2014-07-19 <span style="color:#FF0000;">15:26:30.565 </span>FMDBSortByDateDemo[4423:60b] today ::::: 2014-07-19 <span style="color:#FF0000;">07:26:30</span> +0000
2014-07-19 15:26:30.566 FMDBSortByDateDemo[4423:60b] per_start _:_ 2014-07-18 00:00:00 +0000
2014-07-19 15:26:30.566 FMDBSortByDateDemo[4423:60b] per_end -:- 2014-07-19 00:00:00 +0000
2014-07-19 15:26:30.566 FMDBSortByDateDemo[4423:60b] next_start === 2014-07-20 00:00:00 +0000
2014-07-19 15:26:30.567 FMDBSortByDateDemo[4423:60b] next_end === 2014-07-21 00:00:00 +0000

第一行打印能够看出,我们打印的时间理我如今真正须要的时间差8个小时。这就是时区的偏移,加上8个小时就对了,以下的打印在我定义的头文件里,已经把相对偏加上了!

这里我想说的是:我项目中用到要存数据和date,而数据库(FMDB)是不支持date格式的。我採取的是把相对日历起点的seconds(秒)存起来。通过比对秒数来取想要的数据。

假设大家有好的方法,能够交流!!

以下是我的数据库取值过程:

 NSInteger inter = [MyCutomNSDateDeal preDayOfTheDate_end:today];
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM Temperature WHERE Date > %i ",inter];
// NSString *sql = [NSString stringWithFormat:@"SELECT * FROM Temperature WHERE Date between %li and %li",from,to]; if ([db open]) {
FMResultSet *rs = [db executeQuery:sql];
while ([rs next]) {
NSString *name = [rs stringForColumn:@"Name"];
NSInteger time = [rs intForColumn:@"Date"];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:time];
float temp = [rs doubleForColumn:@"Temperature"];
NSString *event = [rs stringForColumn:@"Event"];
NSLog(@"Name:%@,Date:%@,Temperature:%f,Event:%@",name,date,temp,event);
}
}

两个sql语句都验证了。是正确的,有一点我要说的是,我们在处理取出的数据时,加上了偏移量。所以我们存取数据时。也要加上偏移量。应该例如以下:

-(void)temperatureAndDateUpdate:(float)value
{
NSDate *date = [NSDate date];
NSInteger time = [date timeIntervalSince1970];
time = time + [MyCutomNSDateDeal timeZoneOffset]; //加上时区偏移量
NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:time];
NSLog(@"temperature update date1 === %@",date1);
if ([db open]) { [db executeUpdate:@"INSERT INTO Temperature(Name,Date,Temperature,Event) VALUES (?,? ,?,?)",@"SFX",[NSNumber numberWithInteger:time],[NSNumber numberWithFloat:value],@"吃药"];
NSLog(@"success!!");
}else
{
NSLog(@"error: %@ %@",[db lastError],[db lastErrorMessage]);
}
[db close];
}

NSDate的处理:前一天、后一天等关于时区偏移的处理以及在数据库中的使用的更多相关文章

  1. 日期-用Datapicker实现前一天后一天

    运用了JQuery UI Datepicker 插件和一些常用日期的方法.其中Datepicker的API具体可参考[http://api.jqueryui.com/datepicker/#optio ...

  2. sql server 还原数据库后,删除用户,提示数据库主体在该数据库中拥有架构,无法删除解决方法

    将另一台服务器上的数据库备份文件,在现在用的这台服务器上还原之后,再创建相同的用户名,提示用户已存在 想将之前的用户先删除掉,却提示“数据库主体在该数据库中拥有架构,无法删除解决方法” 在网上找到方法 ...

  3. 支持“***Context”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

    在用VS进行MVC开发的过程中遇到如下问题: 支持“***Context”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft ...

  4. "ApplicationDbContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库。

    一,在我使用自动生成数据库的时候,当你改变了数据库就会出现下面问题 "ApplicationDbContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改. ...

  5. 支持“WeShopDb”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库

    用EF框架搭建完成后,为其中一张表加了一个字段,程序运行时候就一直报这个错误,郁闷了一个晚上,不过通过找资料,上网搜答案,找了好几个解决方案可以解决这个问题,我把他吗分享出来希望可以帮助到你们 方法一 ...

  6. System.InvalidOperationException: 支持“XXX”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

    System.InvalidOperationException: 支持“XXX”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.micro ...

  7. Saiku数据库迁移后的刷新脚本-Shell脚本读取数据库中的数据(二十三)

    Saiku数据库迁移后的刷新脚本 之前有谈过对saiku中的数据进行刷新,因为saiku默认会从缓存中查询数据,但是配置不使用缓存又会效率低下... 所以这里就需要做一个数据刷新,每次ETL之后都需要 ...

  8. 支持“xxxContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库

    将项目的数据库连接用户及密码修改后(切换用户,用户名与原来不一样,用户下对象结构一致),报以下错误: 支持“XXXDBContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code Fir ...

  9. ORACLE数据导入导出后新数据库中某些表添加操作报错[ORA-12899]

    由于项目需要,我在搭建了新的开发环境后,需要将之前环境中的ORACLE数据库导出,再导入到新的开发环境下.当导出导入完成后,使用数据库进行添加操作时 发现针对很多表的添加操作报错,具体报错原因描述为: ...

随机推荐

  1. django-template-loader

    当在settings.py中设置了如下 TEMPLATE_LOADERS=( 'django.template.loaders.filesystem.Loader', 'django.template ...

  2. VS2008查看dll导出函数

    打开Visual Studio 2008 命令提示,使用命令 [plain] view plaincopyprint? dumpbin /exports simple.dll 即可查看

  3. spoj 1812 lcsII (后缀自动机)

    spoj 1812 lcsII (后缀自动机) 题意:求多个串的lcs,最多10个串,每个串最长10w 解题思路:后缀自动机.先建好第一个串的sam,然后后面的串拿上去跑(这个过程同前一题).sam上 ...

  4. Swift - 使用UI Dynamics给UIKit组件添加重力和碰撞行为

    UI Dynamics是UIKit的一个新组成部分,它向iOS中的视图提供了与物理学有关的功能和动画.可以让你向视图中引入力和物理属性,可以让你的视图弹跳,舞动,受重力影响等等. 下面通过样例,演示使 ...

  5. android获取View上某点的颜色

    //根据坐标获取 ImageView imageView = ((ImageView)v); Bitmap bitmap = ((BitmapDrawable)imageView.getDrawabl ...

  6. 如何在VC中显示透明背景位图

    简单的调用系统API. Windows NT/2000/XP: Included in Windows 2000 and later.Windows 95/98/Me: Included in Win ...

  7. WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]

    原文:WCF技术剖析之二十一: WCF基本的异常处理模式[上篇] 由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂.同时,WCF设计的一个目 ...

  8. JS实现图片翻书效果

    picture.html <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http- ...

  9. 基于visual Studio2013解决C语言竞赛题之1020订票

         题目 解决代码及点评 /* 某航空公司规定:在旅游旺季7─9月份,若订票超过20张,优惠票价的15%,20张以下,优惠5%: 在旅游淡季1─5月.10月.11月份订票超过 ...

  10. vs2010中将复制过来的文件或文件夹显示到解决方案管理

    今天在给一个做好的页面上加.net程序,我先将程序中的文件夹复制到解决方案中,可是在VS2010的解决方案资源管理器中并没有这样的文件夹,可明明 在这里,为什么显示不出来,应该在VS2010的哪个地方 ...