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 ...
随机推荐
- sqlmap tamper下模块的使用
使用方法 根据实际情况,可以同时使用多个脚本,使用-v参数可以看到payload的变化. sqlmap.py -u "http://www.target.com/test.php?id=12 ...
- 异想-天开 python---while、for、if-else 循环学习
for循环: for i in range(10): # i循环10次 print('------',i) for j in range(10): print(j) if j > 2 : bre ...
- python基础3 条件判断 if嵌套
if单向判断: stonenumber=6#为宝石数量赋值 if stonenumber>=6: #条件:如果你拥有的宝石数量大于等于6个 print('你拥有了毁灭宇宙的力量') #结果:显示 ...
- DOM---节点关系
DOM可以说是把文档当成一种树状结构,这种结构被称为节点树,JavaScript脚本可以通过节点树访问所有节点,可是执行修改或者是删除它们的内容,同时也可以创建新的节点. 节点之间的关系是有上下级别的 ...
- fiddler 安装证书问题,和安装完后,浏览器无法访问问题
安装证书问题 https://blog.csdn.net/l1336037686/article/details/78322014 浏览器无法访问问题 https://blog.csdn.net/u0 ...
- 多线程深入:乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(转)
原文:https://www.cnblogs.com/qjjazry/p/6581568.html 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每 ...
- Servlet服务器、客户端跳转
服务期跳转.服务器端转发.服务器端重定向是一个意思使用“req.getRequestDispatcher(“跳转路径”).forward(req,resp)”实现服务器端转发 客户端发送请求后数据传输 ...
- 关于cc.easesinexxx 与 cc.easeexponentiallxxx 的几种效果简单描述
代码样例: var biggerEase = cc.scaleBy(0.7,1.2,1.2).easing(cc.easeSineInOut()) 呈正弦变化 1)CCEaseSineIn ...
- Java基础之数组详解
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 numbers[1 ...
- spring-data-radis错误
org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested ...