小贴士(Tips)-iOS

由于iOS的设备对应多国语言,用户也可以选择不同的日历模式。比如日本的和历,泰国日历等等。

用户也可以自行设定24小时制或者12小时制来显示时间。这些设置会直接影响应用程序取得的日期。

我写这篇文章来总结一下程序中相关的类和设备的各种设定的关系。

NSCalendar

[NSCalendar currentCalendar]

[NSCalendar autoupdatingCurrentCalendar]

系统的设置 > 通用 > 多语言环境 > 日历

上述的日历设置和NSCalendar是有直接关系的。

■比如设定成「日本日历」的时候、currentCalendar的值是NSJapaneseCalendar

■设定成「公历」的时候、currentCalendar的值是NSGregorianCalendar

注意:在程序中,currentCalendar取得的值会一直保持在cache中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。如果用autoupdatingCurrentCalendar,那么每次取得的值都会是当前系统设置的日历的值。

系统中定义的日历有:

NSString * const NSGregorianCalendar; 公历(常用)

NSString * const NSBuddhistCalendar; 佛教日历

NSString * const NSChineseCalendar; 中国农历(常用)

NSString * const NSHebrewCalendar; 希伯来日历

NSString * const NSIslamicCalendar; 伊斯兰历

NSString * const NSIslamicCivilCalendar; 伊斯兰教日历

NSString * const NSJapaneseCalendar; 日本日历(和历,常用)

NSString * const NSRepublicOfChinaCalendar; 中华民国日历(台湾)

NSString * const NSPersianCalendar; 波斯历

NSString * const NSIndianCalendar; 印度日历

NSString * const NSISO8601Calendar; ISO8601(但是现在还不可用)

通过Calendar可以设置TimeZone和Locale。

如果你要通过NSDateFormatter来设置日期格式,比如”yyyy-MM-dd”等,那需要注意对Formatter设置日历。

如果想要用公历的时候,就要将NSDateFormatter的日历设置成公历。否则随着用户的系统设置的改变,取得的日期的格式也会不一样。

NSCalendar *calendar =

[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setCalendar:calendar];

NSLocale

[NSLocale currentLocale]

[NSLocale systemLocale]

[NSLocale autoUpdatingCurrentLocale]

NSLocale与下面的设置有关:

系统的设置 > 通用 > 多语言环境 > 区域格式

系统的设置 > 通用 > 日期与时间 > 24小时制

根据国家区域的设置的不同,格式也会不一样,例如:

中国: 「11月」 美国:「November」

中国: 「上午」 美国:「AM」

如果你的应用程序在多个国家发布,那你就需要注意设置NSLocale。

比如:

[[NSLocale alloc] initWithLocaleIdentifier:@”en_US”]

cunnretLocale是用户设定的值。

systemLocale是设备默认的值。

NSDateFormatter

理解日期格式的设置非常重要。

有时候会遇到下面的情况:

比如你将格式设置成

@”yyyy-MM-dd HH:mm:ss”

但显示出来的却是

「0024-11-16 21:09:17」

(这个时候用户把日历设置成了日本日历)

又或者显示成

「2012-11-17 下午11:07:47」

(24小时制关闭的时候)

上述的情况如果不考虑到的话,那程序中就会出现bug。

如果将日期的格式的日历设置成公历,

NSDateFormatter 设置成 NSGregorianCalendar,

需要用24小时制的时候,可以把Locale设置成systemLocale。

(如果你没有特定需要指定的Locale的话)

在开发iOS程序时对日期处理的总结的更多相关文章

  1. 编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题

    在新的SDK环境中调试百度地图的应用程序时,app总是意外退出,找了半天发现错误的原因是unrecognized selector xx的错误,另外还有报了一个Unknown class XXX in ...

  2. Delphi 10.2.3 + Xcode 9.2 开发 IOS 程序,免证书+免越狱,真机调试

    工具列表: 1,delphi 10.2.3 + PAServer19.0. 2,配置好一些的 PC 一台,建议至少 4 代 intel i5 + 16G + 256GSSD,低于此配置将产生拖延症. ...

  3. 解决用Eclipse开发Android程序时不能生成R.java的问题

    今天我照着Mars老师的视频教程开始学习Android程序开发. 但是,我的Eclipse死活不能生成R.java文件,新建的工程也不行. 然后我百度,百度出来的结果一般是说这样解决: 1.clean ...

  4. eclipse开发mapreduce程序时出现的问题

    1.报HDFS权限不够:org.apache.hadoop.security.AccessControlException: Permission denied:user=ouqiping, acce ...

  5. 【iOS开发-32】iOS程序真机调试须要购买调试证书怎么办?

    一.情况 我们在开发iOS程序的时候,一般都是在模拟器上执行查看效果的. 可是,当开完完毕.须要在真机上调试怎么办? 二.官方解决的方法 苹果有为个人和企业开发人员提供调试证书和公布证书.个人版99美 ...

  6. 【转】漫谈iOS程序的证书和签名机制

    转自:漫谈iOS程序的证书和签名机制 接触iOS开发半年,曾经也被这个主题坑的摸不着头脑,也在淘宝上买过企业证书签名这些服务,有大神都做了一个全自动的发布打包(不过此大神现在不卖企业证书了),甚是羡慕 ...

  7. 漫谈iOS程序的证书和签名机制

    接触iOS开发半年,曾经也被这个主题坑的摸不着头脑,也在淘宝上买过企业证书签名这些服务,有大神都做了一个全自动的发布打包(不过此大神现在不卖企业证书了),甚是羡慕和崇拜.于是,花了一点时间去研究了一下 ...

  8. ios外派—本公司长年提供ios程序员外派业务(北京动点软件,可签合同)

    北京动点飞扬长年提供ios工程师外派业务. 我公司程序员平均技术情况如下: 1.二年以上iPhone/ipad开发经验:2.熟练使用Xcode.Objective C编码技能:3.熟悉iOS开发框架, ...

  9. 用Bottle开发web程序(二)

    返回码 在开发web程序时,除了一些服务器错误等,常常需要自定义返回码,以便告诉用户处理请求的结果或者状态.bottle支持自定义的返回码,可以通过以下几种方式进行实现. abort 在bottle中 ...

随机推荐

  1. vue组件中的data与methods

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...

  2. ArcCatalog连接数据库报错

    ArcCatalog连接数据库报错: Failed to connect to database. Cannot connect to database because the database cl ...

  3. 张量(tensor)的广播

    在使用numpy 对张量(数组)进行操作时,两个形状相同的张量进行加减等运算很容易理解,那么不同形状的张量之间的运算是通过广播来实现的.广播实际上很简单,但是弄清楚是也花了不小功夫,这里记录一下. 广 ...

  4. el-table——可编辑、拖拽排序与校验的formTableDrag

    背景: 1.利用form进行校验输入: 2.利用sortable操作Dom替换表格数据顺序: 3.利用lodash实现数据深拷贝与参数替换等 一:最外层的数组校验 <template> & ...

  5. 阿里面试官总结40 个 Java 多线程问题

    前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位 ...

  6. Python——hashlib(加密模块)

    主要用于对字符串的加密,最常用的为MD5加密: import hashlib def get_md5(data): obj = hashlib.md5() obj.update(data.encode ...

  7. java--动态代理设计模式,CGLIB实现的动态代理设计模式

    代理设计模式 代理设计模式的基本形式 代理设计模式的核心思路,一个接口两个子类,一个子类完成核心业务操作,另一个完成与核心业务有关的辅助性操作.例如,编写一个简单的设计模式. package com. ...

  8. javascript reduce 前端交互 总计

    sum(){ return this.products.reduce((total,next)=>{ return total + next.price * next.aumout},0) } ...

  9. 用js刷剑指offer(二叉搜索树的后序遍历序列)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 牛客网链接 js代码 function Verif ...

  10. SASS 和 LESS 的区别

    1.编译环境不同 SASS 的安装需要 Ruby 环境,是在服务端处理的: LESS 需要引入 less.js 来处理代码输出 CSS 到浏览器,也可以在开发环节使用 LESS,然后编译成 CSS 文 ...