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

简介:

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

                                                                                                                                    --宋飞祥    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]; }










本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5127327.html,如需转载请自行联系原作者

相关文章
|
4月前
|
数据库连接
数据库连接的时区问题 The server time zone value is unrecognized
数据库连接的时区问题 The server time zone value is unrecognized
22 0
|
8月前
|
存储 关系型数据库 数据库连接
[Nestjs] 使用Typeorm配置数据库配置时区的方法
如果在使用 TypeORM 和 NestJS 进行数据库操作时,遇到数据库时间不准确的问题,可以考虑以下几个解决办法: 1. 使用数据库服务器的时间:确保数据库服务器的时间是准确的,并且与应用程序运行的服务器时间同步。这样可以避免由于时间差异导致的数据不准确问题。 2. 设置数据库连接的时区:通过在 TypeORM 配置中设置 timezone 属性,将数据库连接的时区设置为与应用程序所在地区相匹配。例如,对于 PostgreSQL 数据库:
478 0
|
11月前
|
关系型数据库 MySQL Java
MySQL 数据库时区设置方法,“The server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents ...” 问题解决
MySQL 数据库时区设置方法,“The server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents ...” 问题解决
211 0
|
Java 数据库 Spring
spring中bean配置8.0版本数据库,时区解决问题!
spring中bean配置8.0版本数据库,时区解决问题!
|
数据可视化 关系型数据库 MySQL
一篇永久摆脱Mysql时区错误问题,idea数据库可视化插件配置
一篇永久摆脱Mysql时区错误问题,idea数据库可视化插件配置
一篇永久摆脱Mysql时区错误问题,idea数据库可视化插件配置
|
存储 Java 关系型数据库
客户端、服务器、数据库之间的时区转换
做国外的项目经常会遇到时区转换的问题,这里简单针对遇到的时区问题做个记录,也希望对大家有所帮助,少走弯路。(本文设计开发语言为java)
客户端、服务器、数据库之间的时区转换
|
关系型数据库 数据库 PostgreSQL
postgresql 时区配置,系统主机与数据库时间不一致
--有时候操作系统的时间与pg的时间不一致,这往往时两者时区不一致造成的 --查看系统时间与时区 [postgres@rudy_01 data]$ date Thu Nov 19 09:3...
1532 0
|
Oracle 关系型数据库 MySQL
LINUX时区设置及与数据库之间(ORACLE MYSQL)的关系
LINUX时区    LINUX 操作系统时区由/etc/localtime设置,其可以是一个指向/usr/share/zoneinfo下文件的软连接, 当然也可以拷贝,在/usr/share/zoneinfo目录下每个文件都包含了特定地区的时区信息,很多都分...
1300 0
|
数据库
如何修改数据库时区
如何修改数据库时区 转自:http://space.itpub.net/175005/viewspace-618100 首先确认会话时区是否正确,会话时区可能和数据库时区不一致SQL> SELECT SESSIONTIMEZONE FROM DUAL; SESSIONTIMEZONE-----...
829 0
|
6天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
37 2

热门文章

最新文章