iOS日期问题
由于项目需要,需要获取去设备的当前时间,组成一个字符串,比如 2018年9月15日 15点30分30秒,需要转换成字符串:180915153030。
很简单的一个需求,于是就使用了日期格式话当前时间:
let currentDate: Date! = Date()
let dateFormatter = DateFormatter.init() dateFormatter.dateFormat = "yyMMddHHmmss" let timeStr = dateFormatter.string(from: currentDate)
就是这段代码,自己测试后没有问题,就提交了,并上线了,可是到客户那出现了问题。由于我这里不是展示timeStr,而是和另外一个需求一起使用,导致另外一个功能失败。这个隐藏的bug让我找了一个多月的时间。在自己手机上测试,找了好几个手机测试都没有问题。客户那使用时出现问题,也没有往这想,会是这段代码出现问题。最终发现是和手机设置的日期格式(12小时制和24小时制有关系)及日历选择。
下面就来分析在不同情况下获取到的字符串都啥样。
1)在设置->通用->日期和时间设置24-Hour Time关闭
获取到的时间字符串为:18091534200 pm,可以发现yyMMddHHmmss这个格式对时间进行了格式化,但是其中的小时没有格式化为24小时制的,而且后面还多了一个空格及pm表示下午,可见没有获得我们想要的格式,用户的日期格式的设置会影响到我们获取到的时间。
2)打开24-Hour Time
获取到的时间字符串为:180915154617(时间是运行程序时的时间,所以和上面不同,下同),很明显,这个获得了我们想要的字符串。
3)在设置->通用->语言和地区中有个日历(Calendar)有三种选择:Gregorian也就是我们用的公历,上面两种情况都是在公历下输出的结果;Japanese也就是日本的日历,目前叫平成年,2018年就是平成30年。Buddhist佛教日历。
那好我们就设置下日本日历看看获取到的是啥:
24小时制下:300915155438,可见除了年份不对外,其它都对,年份是30,也就是平成30年
12小时制下:300915155800,可以发现并没有上面的pm标记,也就是这个问题导致我这个bug迟迟没被发现,只有在设备语言设置为英文并且是公历的情况下才会输出pm后缀,平时测试用的简体中文设置,12小时制,所以客户出现的错误,我这怎么也复现不了。
咱们再看看佛历的输出:
24小时制下:610915160205,可以发现不仅年份不一样,日以及时间都不对,这个时间是按佛历计算的,有兴趣的话可以查查佛历。
12小时制下:610915160406,同上,同时也没有出现pm后缀。
说了这么多,怎么才能获取到需要的时间字符串呢?
解决方法如下:
1).设置dateFormatter的calendar属性,就是制定日历,直接指定公历,这样避免了使用用户的设置
dateFormatter.calendar = Calendar.init(identifier: .gregorian)
2)这样还不够,如果只设置上面的日历属性获取到的时间字符串还是带有pm后缀,而且在12小时制下获取到的字符串也不对,小时并没有按照24小时格式化,还需要设置local属性,本地化
dateFormatter.locale = Locale.init(identifier: "NL")
上面是设置格式的本地化属性,其中NL是荷兰的缩写,这个解决方法是在网站找到的,设置为NL的话,格式时间时就是HH来格式化的,这个应该设置别的国家也可以。至此,只要设置到上面两个属性,格式化得到的就是我们想要的格式yyMMHHmmss格式了。
另外一种解决方法:
// 获取当前时间
let currentDate: Date! = Date()
// 一定要使用公历日历gregorian
let calendar: Calendar! = Calendar.init(identifier: .gregorian)
let weekComps: DateComponents! = calendar.dateComponents([.year, .month, .day, .weekday - 1, .hour, .minute, .second], from: currentDate)
上面获取的DateComponents对象,里面有各个日期字段,然后通过拼接字符串即可得到想要的字符串,这里不用设置本地化,只需指定公历即可,在哪种语言下获取的都是24小时格式的。上面这个还获取了周,其中周需要减1才能得到当前的星期数。
18091534200 pm
18091534200
iOS日期问题的更多相关文章
- placeholder的字体样式改变,滚动条的颜色改变,ios日期兼容
placeholder:::-webkit-input-placeholder { color: rgba(153, 153, 153, 0.541);font-size:12px;}:-moz-pl ...
- Java与IOS日期格式
//JAVA日期格式 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM- ...
- ios日期显示NaN
ios中js通过getMonth()获取到的日期显示NaN,而在其他地方如pc.安卓都是ok的,这是为什么呢,原来这里有个ios的兼容问题,需要将日期中的“-”替换为“/” var time = ne ...
- ios日期格式转换
转自:http://blog.csdn.net/l_ch_g/article/details/8217725 1.如何如何将一个字符串如“ 20110826134106”装化为任意的日期时间格式,下面 ...
- IOS 日期的简洁格式展示
首先我要解释一下标题的意义,日期的简洁格式展示,之所以简介,是因为让人一目了然,不需要思考是什么时候. 在详细一点就是我们在微信朋友圈中 所看到的时间格式. 例如:刚刚 -几分钟前-几小时前等等. 今 ...
- iOS 日期处理 (Swift3.0 NSDate)
处理日期的常见情景 NSDate -> String & String -> NSDate 日期比较 日期计算(基于参考日期 +/- 一定时间) 计算日期间的差异 拆解NSDate ...
- IOS 日期选择
传统方式 一般情况下弹出日期选择的场景是:用户点击UITextField弹出日期选择,关键代码如下: 点击UITextField弹出日期选择 1 2 3 UITextField *textField; ...
- jquery仿ios日期时间插件
Demo下载: 手机时间控件.zip 使用之前,请在页面中加入以下js和css: jquery-1.9.1.js mobiscroll.core-2.5.2.js mobiscroll.core-2. ...
- IOS --- 日期时间格式 更改
1.怎样怎样将一个字符串如" 20110826134106"装化为随意的日期时间格式.以下列举两种类型: NSString* string =@"201108261 ...
- iOS 日期时间控件
UIDatePicker *picker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 0,[UIParam widthScreen] ,50 ...
随机推荐
- LeetCode 33 - 搜索旋转排序数组 - [二分]
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- CQL语句
CQL中默认忽略大小写,若需要大小写敏感,可使用双引号将对象包起来,引用的时候也要用双引号包住 tips: 使用CQL需要预装Python环境 Ⅰ.基本知识点 1.1 数据类型 这边和关系型数据库相近 ...
- 20175303 2018-2019-2 《Java程序设计》第8周学习总结
20175303 2018-2019-2 <Java程序设计>第8周学习总结 教材学习内容总结 本周学习<Java程序设计>第十五章: 泛型: 泛型(Generics)的主要目 ...
- flask读书笔记
学习flask的一个很好的网站:http://www.pythondoc.com/flask-mega-tutorial/helloworld.html ======================= ...
- Autofac之类型关联
前面的学习一直使用的是直接注册类型并不是Autofac已经依赖注入的主要使用方式,最佳的依赖注入与Autofac的使用方式,都是要结合面向接口(抽象)编程的概念的.推崇的是依赖于抽象而不是具体 pub ...
- Get WMS Static GoodLocation By Dynamic SQL
Dynamic SQL Store Procedure: Note: use variable,you need convert varchar and as a variable,not direc ...
- 小程序开发 easy-less 配置
开发支付宝小程序, 不习惯直接写css 了,推动小程序的开发太低效,讲道理默认构建就应该支持less 和sass. vscode 有easy-less 插件,看下配置支持自定义扩展名. { &quo ...
- opencart3产品页调用upc/数量等信息
opencart3产品页默认只调用标题.价格.型号等几个数据,如果想要调用更多的参数要如何操作呢?跟着ytkah一起来看看吧.首先打开/catalog/model/catalog/product.ph ...
- jQuery 选择具有特殊属性的元素
如今有这样一种需求,须要选出全部有背景图片的元素. 这个问题有点棘手.我们无法使用选择表达式来完毕这个问题了. 使用jQuery的DOM过滤方法filter(),能够依据函数中表达的不论什么条件选择元 ...
- 关于 RESTful API 中 HTTP 状态码的定义
最近正好使用了一会儿 Koa ,在这说一下自己对各个 请求码的见解和使用场景,懒人直接看 200.400.401.403.404.500 就可以了. 其中 2XX/3XX 其实都是请求成功,但是结果不 ...