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

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

--宋飞祥    2014.7.19

直接上代码,很容易理解:

#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];
}
时间: 2024-11-08 22:01:03

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

(PowerDesigner&amp;Sqlite)PD中设计完表后,将其导入数据库中

  本人连接过SQLServer跟SQLite Ⅰ.SQLServer,百度,转一下:http://jingyan.baidu.com/article/7f766daf465e9c4101e1d0d5.html 只复制了文字,图片麻烦,只是以防链接失效 1.当建立好表结构之后,选择导航栏中的"数据库",然后选择"Configure Connections" 如下图所示: 2.添加数据源,点击下图标红位置,然后选择"文件数据源(与机器无关)"然后选

Java 读取txt文件后把数据保存到数据库中

需求:有一个很大的txt文件(1,000,000条数据),从txt中读取有用数据库后保存到Oracle数据库中 利用Java实现: 1.读取文件 2.数据库连接后插入到数据库 package com.test.IF.service; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedS

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

将另一台服务器上的数据库备份文件,在现在用的这台服务器上还原之后,再创建相同的用户名,提示用户已存在 想将之前的用户先删除掉,却提示“数据库主体在该数据库中拥有架构,无法删除解决方法” 在网上找到方法,试了一下,还真管用. --执行如下SQL语句 ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo; --然后手动删除就可以了 我看还原后的数据库中的db_owner架构所有者就是那个要删除的用户名,再看其他数据库中的db_owner架构的所有者就是db_o

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

System.InvalidOperationException: 支持"XXX"上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269). EF发布时遇到的问题(数据库初始化 http://www.cr173.com/html/17941_1.html) public ZujuanWebSiteDataEntities() : base("cloud_

用session_set_save_handler函数实现将session保存在数据库中后session不能跨页面了

<?php /*============================文件说明======================================== @filename:     session.class.php @description:  数据库保存在线用户session,实现在线用户功能! @notice:       session过期时间一个小时,因为我们的站点是使用cookie(有效时间是1小时)登录.                因此我们只记录用户登录的时间,而不是

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

在用VS进行MVC开发的过程中遇到如下问题: 支持“***Context”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269). 解决了,把数据库中检测模型变化的表(如上图所示)删除就可以了

软件测试背锅了:出现问题后,研发怀疑当初测试不到位(其实在测试过程中已经测试完成而且没有出现问题)这种情况怎么办?

2019-02-25 22:51:26 背锅场景:出现问题后,研发怀疑当初测试不到位(其实在测试过程中已经测试完成而且没有出现问题)这种情况怎么办? 背锅图片这种问题其实工作中不少 处理方案: 1)追踪开发是否在你测试完成后动过代码,如果动过,OK,你可以避免: 2)如果开发没动过,但是正好自己测试到但又出现问题. 对于第二种情况,首先定位问题,看看问题到底是自己漏测还是确实存在.如果漏测就不用说了,自己承担就好.确实存在那么你要看看到底是什么原因又将该问题引起了,然后再针对具体问题具体做处理.

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

Saiku数据库迁移后的刷新脚本 之前有谈过对saiku中的数据进行刷新,因为saiku默认会从缓存中查询数据,但是配置不使用缓存又会效率低下... 所以这里就需要做一个数据刷新,每次ETL之后都需要执行一遍数据刷新脚本. 刷新脚本主要分为两部分 1.使用shell命令从数据库中读取已有的用户信息 (因为已经做过数据迁移,数据库已经从h2转为我们自己的mysql) saikuRefresh.sh #!/bin/bash #数据库连接信息 HOSTNAME="10.11.22.33" #

&quot;支持“xxx”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库”解决办法

学习Asp.Net MVC4 时,使用EF.本来正常,但是由于修改了一下Model中的一个实体类. 导致这个错误. “支持“xxx”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库”. 为了解决上述错误,在Global.asax文件中在 Application_Start后添加以下语句: Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SalesERPDAL>()); 注意需引入命名