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 ...
随机推荐
- luarocks 包管理工具
安装方式:wget http://luarocks.org/releases/luarocks-2.2.2.tar.gz tar zxvf luarocks-2.2.2.tar.gz cd luaro ...
- Mac 下安装Fiddler抓包工具
需求 我们都知道在Mac电脑下面有一个非常好的抓包工具:Charles.但是这个只能抓代理的数据包.但是有时候想要调试本地网卡的数据库 Charles 就没办法了.就想到了在windows下面的一个F ...
- mysql-8.0.15-winx64 解压版安装
官网下载了一个 mysql-8.0.15-winx64.zip 版本,解压部署过程记录如下: 1.将zip包解压到D盘 2.配置环境变量 在Path中加入D:\Program Files\mysql- ...
- linux基础命令--groupadd 创建新的群组
描述 groupadd命令用于创建一个新的群组. groupadd命令默认会根据命令行指定的值和系统下的/etc/login.defs文件定义的值去修改系统下的/etc/group和/etc/gsha ...
- 当使用eclipse将项目部署到Tomcat时,提示Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul
原因: 此版本选择过高.当出现此错误时,直接对项目可能无法进行修改.可以通过修改项目的配置文件来达到目的. \workspace\项目名称\.settings\org.eclipse.wst.comm ...
- MSSQL2008 数据库展开报错:值不能为空。 参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
今天打开数据库,结果出现:值不能为空. 参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer) 百度之后找到其中一种解决方案 ...
- MySQL 误删数据、误更新数据(update,delete忘加where条件)
MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 转自:https://www.cnblogs.com/gomysql/p ...
- html5+css基础
最近在学习html+css3基础教程,整理了一些基础知识点.在此与大家分享. 1.盒模型 定义:css处理网页时,它认为每个元素都包含在一个不可见的盒子里,即我们所熟知的盒模型.其中它的主要属性有:h ...
- PyAutoGUI使用
PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务,再也不用担心有重复枯燥的任务了. 安装: pip install pyau ...
- python selenium处理windows窗口
selenium本身处理不了windows窗口,需要借助,PyAutoit包 与autoit工具 这里以文件上传窗口为例: 1.安装python pyauto包 pip install PyAutoi ...