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

--宋飞祥    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. js判断IP js判断域名

    <html> <head> <script language="javascript" type="text/javascript" ...

  2. Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)

    所谓 IO 其实不过是与其他设备之间的数据交互.在 Linux 上这个概念或许会更加清楚一些.Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互.同样,与其他进程之间也 ...

  3. Robot Framework与Web界面自动化测试学习笔记:简单例子

    假设环境已经搭建好了.这里用RIDE( Robot Framework Test Data Editor)工具来编写用例.下面我们对Robot Framework简称rf. 我们先考虑下一个最基本的登 ...

  4. ExcelParser ,Excel解析的工具类(正对解析xlsx)

    package cn.com.css.common.util; import java.io.File; import java.io.FileInputStream; import java.io. ...

  5. 真机iOS SDK升级后xcode不能进行真机调试 怎么办

    今天升级了一下iPod的SDK到iOS8,xcode仅仅能支持到7.1,真机调试遇到问题???以下是解决的方法! 找到xcode,点击右键.打开显示包内容,按路径Contents/Develpoer/ ...

  6. (step6.1.5)hdu 1233(还是畅通工程——最小生成树)

    题目大意:输入一个整数n,表示有n个村庄,在接下来的n*(n-1)/2中,每行有3个整数beigin.end.weight,分别表示路的起始村庄,结束村庄和村庄之间的距离. 求索要修的路的最短距离 解 ...

  7. PCB设计资料:看到最后才知道是福利

    參考资料 通过以下的关键词直接从网络上Google或Baidu就能非常easy的找到以下的资料,这里仅仅是以參考文献的方式做一个整理以及简单的说明. 刘雅芳,张俊辉. 抗干扰角度分析六层板的布线技巧. ...

  8. [JBoss] JNDI与JBossNS

    JNDI的作用 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface). 随着分布式应用的发展,远程访问对象访问成为常用的方法.虽然说通过Soc ...

  9. log4net使用流程

    前面大致介绍了一下log4net的概述和结构.既然都清楚了,下面我来介绍一下如何使用log4net. 使用流程 1.这里所说的使用流程就是使用log4net.dll,首先要根据你的平台来找出对应的版本 ...

  10. dos2unix与unix2dos之学习记录

    1. unix2dos与dos2unix这两个tool是用来干什么的? 这首先应该要说明一下背景知识: unix类操作系统下,换行字符是\n: 而早期的dos操作系统,其换行字符是由\r\n组成. 所 ...