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

2024-08-22 18:38

本文主要是介绍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];
}


这篇关于NSDate的处理:前一天、后一天等关于时区偏移的处理以及在数据库中的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097079

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]