iOS自带三种日历,公历、佛教日历和日本日历,要设置日历可以进入"设置-通用-语言与地区-日历"设置,我们中国使用的iPhone默认设置成公历。而泰国人使用的iPhone默认设置的日历是佛教日历。这样会导致同样的代码在国内显示正常,去泰国就仿佛穿越了一般。

问题:使用NSDate *today = [NSDate date];获取的当前的时间在国内显示正常是2017年,而到了泰国却变成了2056年,这是为什么呢?即使是时区差别,也不能差如此多呀??

经过仔细思考,发现语言和地区的设置之中有一个地方可以设置日历,进去把公历改成佛教日历,发现原来显示的2017变成了2056。

方法一:

解决办法:提供一种不受时区、系统日历、本地化等限制,获得公历中的正确的年份、月份、时间等的方法。

Global.h

@property (strong,nonatomic) NSCalendar *calendar;
@property (strong,nonatomic) NSDateComponents *components;
@property (copy,nonatomic) NSString *year;
@property (copy,nonatomic) NSString *month;
@property (copy,nonatomic) NSString *day;
@property (copy,nonatomic) NSString *hour;
@property (copy,nonatomic) NSString *minute;
@property (copy,nonatomic) NSString *second;

Global.m

- (NSCalendar *)calendar{
if(!_calendar){
#ifdef __IPHONE_8_0
_calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];//根据Identifer获取公历
#else
_calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];//根据Identifer获取公历
#endif
_calendar.timeZone = [NSTimeZone localTimeZone];//消除时区差异
_calendar.locale = [NSLocale currentLocale];//消除本地化差异,本地化包括语言、表示的日期格式等
} return _calendar;
} - (NSDateComponents *)components{
if (!_components) {
NSDate *date = [NSDate date];
_components = [self.calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday fromDate:date];
} return _components;
} //返回当前年份
- (NSString *)year{
if (!_year) {
_year = [NSString stringWithFormat:@"%04ld",[kGlobal.components year]];
}
return _year;
} //返回当前月份
-(NSString *)month{
if (!_month) {
_month = [NSString stringWithFormat:@"%02ld",[kGlobal.components month]];
}
return _month;
} //返回当前号数
- (NSString *)day{
if (!_day) {
_day = [NSString stringWithFormat:@"%02ld",[kGlobal.components day]];
}
return _day;
} //返回当前的小时
- (NSString *)hour{
if (!_hour) {
_hour = [NSString stringWithFormat:@"%02ld",[kGlobal.components hour]];
}
return _hour;
} //返回当前的分钟
- (NSString *)minute{
if (!_minute) {
_minute = [NSString stringWithFormat:@"%02ld",[kGlobal.components minute]];
}
return _minute;
} //返回当前的秒钟
- (NSString *)second{
if (!_second) {
_second = [NSString stringWithFormat:@"%02ld",[kGlobal.components second]];
}
return _second;
}

2017-02-04更新:

方法二:正常获取公历年月日(系统日历为佛教日历或其他非公历日历)

1.首先创建一个公历日历对象

- (NSCalendar *)calendar{
if(!_calendar){
#ifdef __IPHONE_8_0
_calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];//根据Identifer获取公历
#else
_calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];//根据Identifer获取公历
#endif
_calendar.timeZone = [NSTimeZone localTimeZone];//消除时区差异
_calendar.locale = [NSLocale currentLocale];//消除本地化差异,本地化包括语言、表示的日期格式等
} return _calendar;
}

2.在NSDateFormatter格式化对象的时候加上一条语句就行:[formatter setCalendar:self.calendar];

- (NSDateFormatter *)formatter{
if (!_formatter) {
_formatter = [[NSDateFormatter alloc] init];
[_formatter setCalendar:kGlobal.calendar];
[_formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
}
return _formatter;
}

总结:NSDateFormatter如果不设置日历对象,默认使用的是系统的日历对象,所以无论你使用什么方式得到正确的公历年月日,如果最后格式化了日期,都会变成系统默认的日历日期,所以

格式化日期的时候需要设置NSDateFormatter的Calendar对象。同理系统默认的UIDatePicker应该也可以这么设置(有待验证)。

iOS中的日历的更多相关文章

  1. ios中VRGCalendarView日历控件

    http://pan.baidu.com/share/link?shareid=4166002480&uk=923776187 官网 https://github.com/TjeerdVuri ...

  2. iOS - OC NSCalendar 日历

    前言 @interface NSCalendar : NSObject <NSCopying, NSSecureCoding> NSCalendar 对世界上现存的常用的历法进行了封装,既 ...

  3. iOS - Swift NSCalendar 日历

    前言 public class NSCalendar : NSObject, NSCopying, NSSecureCoding NSCalendar 对世界上现存的常用的历法进行了封装,既提供了不同 ...

  4. iOS中处理时间的类

      登录|注册     sakulafly的专栏       目录视图 摘要视图 订阅 Markdown博文大赛清新开启    天天爱答题 一大波C币袭来    中国云计算大会演讲议题公布     大 ...

  5. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  6. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  7. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  8. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  9. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

随机推荐

  1. 数据预处理及sklearn方法实现

    1.标准化(中心化) 在许多机器学习执行前,需要对数据集进行标准化处理.因为很对算法假设数据的特征服从标准正态分布.所以如果不对数据标准化,那么算法的效果会很差. 例如,在学习算法的目标函数,都假设数 ...

  2. nginx学习之简化安装篇(一)

    环境:CentOS 6.5 1. 安装依赖环境 [root@localhost ~]# yum install pcre-devel zlib-devel openssl-devel -y 2. 安装 ...

  3. 我的Android进阶之旅------>WindowManager.LayoutParams介绍

    本文转载于: http://hubingforever.blog.163.com/blog/static/171040579201175111031938/ 本文参照自: http://develop ...

  4. 11.Django数据库操作(查)

    django.db.models.query.QuerySet1.可迭代2.可切片 官方文档:https://docs.djangoproject.com/en/1.9/ref/models/quer ...

  5. full_case parallel_case学习心得

    一般情况下,DC把case语句综合成选择器电路,但也可能把case语句综合成优先权译码电路.有时,优先权译码电路是不必要的,这是可以使用“// synopsys parallel_case”引导语句强 ...

  6. Arduino 看门狗使用

    1.需要调用 #include <avr/wdt.h> 2.设置看门狗复位时间 wdt_enable(WDTO_2S); 代码时间定义的底层查看 #define WDTO_15MS 0 / ...

  7. 路由helper

    root_url http://192.168.1.110:3000/users/sign_up?inviter=14658733081530 root_path /users/sign_up?inv ...

  8. PAT天梯赛 L2-019. 悄悄关注 【STL】

    题目链接 https://www.patest.cn/contests/gplt/L2-019 思路 将已关注的人 用 MAP存起来 然后将点赞的用户中 没有关注的 用 VECTOR 存下来 并且求出 ...

  9. IOS int NSInteger NSNumber区分

    1.NSNumber 是一个类继承于NSValue 即一个基本数据类型的集合 包括char a signed or unsigned char, short int, int, long int, l ...

  10. Data Structure Linked List: Reverse a Linked List in groups of given size

    http://www.geeksforgeeks.org/reverse-a-list-in-groups-of-given-size/ #include <iostream> #incl ...