OC calendar 实践中的那些坑
博客已经迁移到www.chjsun.top
最近想做一个万年历似的东西,因为需要把农历也添加进去,就想直接调用苹果自带的api,这样还方便一些,
搜索了一下,苹果对于时间的处理,还是提供了很多选择给我们用的
比如:
NSDate -- 表示一个绝对的时间点
NSTimeZone -- 时区信息
NSLocale -- 本地化信息
NSDateComponents -- 一个封装了具体年月日、时秒分、周、季度等的类
NSCalendar -- 日历类,它提供了大部分的日期计算接口,并且允许您在NSDate和NSDateComponents之间转换
NSDateFormatter -- 用来在日期和字符串之间转换 。
今天,我们就说说我在开发时遇到的问题:
主要问题有两个
1, 就是NSDate
2, 就是NSCalendar
--1------
NSDate
// 日期和字符串之间的转换
- (NSDate *) strToDate
{
NSString *dateStr = @"1986-9-14"; NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 这个格式可以随便定义,比如:@"yyyy,MM,dd,HH,mm,ss"
[formatter setDateFormat:@"yyyy-MM-dd"]; // 年-月-日
// 将字符串按照格式转换成NSDate
NSDate *date = [formatter dateFromString:dateStr];
return date;
}
这段代码本身是可以用的

在这里,可以看到 已经成功的将9-29日转换成 utc的9-28日
但是(怎么问题总是在"但是"里 —_—):
这段代码,在dateStr 是 @"1986-5-4"的时候,date为空,在@"1986-5-5" 和@"1986-9-14"之间
date是 "xxxx-xx-xx 15:00:00 UTC"。下图为证


我们都是知道的,中国在东八区,应该是 16:00:00 才对,而且只有这一时间段出问题,这是不正常。
原因: 这是因为中国的"夏令时问题"
1986年4月,我国采取夏令时,具体作法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。1992年起,夏令时暂停实行
也就是说:
1986年4月13日至9月14日,
1987年4月12日至9月13日,
1988年4月10日至9月11日,
1989年4月16日至9月17日,
1990年4月15日至9月16日,
1991年4月14日至9月15日。
这些时间是有问题的,15:00:00,是因为夏令时的原因
哪还有一个问题,就是5月4号为空,这个就还没想到
要解决这个问题很简单,因为默认使用的是Asia/Shanghai 所以只要添加两句代码就搞定了
// 日期和字符串之间的转换
- (NSDate *) strToDate
{
NSString *dateStr = @"2057-9-29";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 新添加的两句代码 ---------- start ----------
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
// ---------- end ----------
[formatter setDateFormat:@"yyyy-MM-dd"]; // 年-月-日 时:分:秒
// 这个格式可以随便定义,比如:@"yyyy,MM,dd,HH,mm,ss"
NSDate *date = [formatter dateFromString:dateStr];
NSLog(@"date = %@", date); return date;
}
解决;
问题2:在使用NSCalendar的时候,时间是 2057-9-28日那天,农历day返回的是0,而其他时间返回的是1~30之间,为什么会出现这个问题呢,请看下面两张图


这两张图的28号 农历都是一个 o 那么,调用api 部分代码
/** 农历月 */
@property (nonatomic, strong) NSArray *chineseMonths; //农历月数据,加载一次足矣
-(NSArray *)chineseMonths{
if (!_chineseMonths) {
_chineseMonths = [NSArray arrayWithObjects:
@"正月", @"二月", @"三月", @"四月", @"五月", @"六月", @"七月", @"八月",
@"九月", @"十月", @"冬月", @"腊月", nil]; }
return _chineseMonths;
}
// get chinese day
-(NSString *)getChineseWeekDaysWithDate:(NSDate *)date{ NSCalendar *chineseCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese];
NSDateComponents *localeComp = [chineseCalendar components: NSCalendarUnitDay fromDate:date]; return [self.chineseDays objectAtIndex:localeComp.day-];
}
角标变成-1 就报错了,解决办法就是在返回的时候做一次判断,根据上图显示,姑且就认为 o 就是30号
return [self.chineseDays objectAtIndex:(localeComp.day==? : localeComp.day-)];
转载请注明出处
OC calendar 实践中的那些坑的更多相关文章
- Docker实践中遇到的坑
1.docker容器中后台运行退出执行curl+p+q,再次进入执行命令docker attach 容器id. 2.容器中exit退出后,还原方法为docker ps -a 查看历史运行容器,dock ...
- vue实践中的狗血事件之:mock数据引发的血坑
在项目实践中,遇到了这么一档子事 开发环境下,很快乐,什么事儿都没有,于是想打包一下测一下自动登录的效果 好家伙,一开始登录没有效,改来改去,最后连路由都切换不了, 明明开发环境下好好的,为毛打包后就 ...
- 整理iOS9适配中出现的坑(图文)
原文: http://www.cnblogs.com/dsxniubility/p/4821184.html 整理iOS9适配中出现的坑(图文) 本文主要是说一些iOS9适配中出现的坑,如果只是要 ...
- Vue项目实践中的功能实现与要点
本贴记录项目实践中,各种功能的实现与技术要点,均有待改进. 路由切换的时候,显示loading动画 目前方案是: 在每个页面都手动装载一个loading组件组件的显示依赖vuex里面的一个值 , 在r ...
- Netty中的那些坑
Netty中的那些坑(上篇) 最近开发了一个纯异步的redis客户端,算是比较深入的使用了一把netty.在使用过程中一边优化,一边解决各种坑.儿这些坑大部分基本上是Netty4对Netty3的改进部 ...
- .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结
.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...
- DevOps落地实践点滴和踩坑记录-(1)
记录初衷 本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分享给和我一样的一线 ...
- DevOps落地实践点滴和踩坑记录-(2) -聊聊平台建设
很久没有写文章记录了,上一篇文章像流水账一样,把所见所闻一个个记录下来.这次专门聊聊DevOps平台的建设吧,有些新的体会和思考,希望给正在做这个事情的同学们一些启发吧. DevOps落地实践点滴和踩 ...
- Nancy总结(二)记一次Nancy 框架中遇到的坑
记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上 ...
随机推荐
- nginx的ngx_http_request_t结构体
struct ngx_http_request_s { uint32_t signature; /* "HTTP" */ //请求对应的客户端连接 ngx_connection_t ...
- 委托的例子,from C# advanced program
class BubbleSorter { static public void Sort<T>(IList<T> sortArray, Func<T, T, bool&g ...
- 本地搭建PHP环境后进入应用失败
进入localhost/wordpress或者其他应用,直接出现类似以下这种情况: 解决方法是修改tomcat的配置文件httpd.conf中: <IfModule dir_module> ...
- 使用ef查询有缓存的问题
使用mvc ef更新后数据之后刷新页面,发现页面的数据没有变,而数据库的数据更新了,找了一点资料,是因为ef6有个缓存机制: Repository 类: //此方法查询结果有缓存 public Lis ...
- Windows Store App 全球化:应用中设置语言选项
当开发者将开发的应用上传到Windows应用商店以后,使用Windows 8系统的用户可能会看到并下载这些应用,而这些用户所在的区域或者所使用的语言可能都不相同,如果他们在使用应用程序时希望改变应用显 ...
- js面向对象的封装方法,【案例】
封装方法: /** * @矩形canvas库 * @authors Shimily (275766400@qq.com) * @date 2016-12-28 10:30:51 * @version ...
- Linux主机共享目录给Windows主机的方法
Linux主机共享目录可以通过samba来实现 首先,来看下百科上关于samba的介绍: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Ser ...
- 自定义view文字垂直居中
FontMetricsInt fontMetrics = deletePaint.getFontMetricsInt(); int baseline = rect.top + (rect.height ...
- dom事件与event对象总结
1 事件:就是文档或浏览器窗口中发生的一些特定的交互瞬间. tips:js和xhtml的交互是通过当用户或浏览器操作网页时发生的事件来处理的. 1.1 事件流:即事件的顺序. 事件 ...
- P53 T2
为方便储户,某银行拟开发计算机储蓄系统.储户填写的存款单或取款单由业务员输入系统,如果是存款,系统记录存款人姓名.住址.存款类型.存款日期.利率等信息,并印出存款单给储户:如果是取款,系统计算利息并印 ...