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 ...
随机推荐
- java--List、Set、Map的基础
好像面试很多面试官都喜欢问这它们的一些问题,所以在这里我稍微总结一下,并把大佬们的文章链接贴在后面. 首先我们借鉴了https://www.cnblogs.com/SnowingYXY/p/67273 ...
- [05-02]红帽linux常用操作命令
命令怎么用(三种方式) shutdown --help shutdown --? man shutdown (man 就是manual 手册, 指南) 服务 service 怎么知道服务的名字呢? ...
- Web开发(调试方法 F12)
参考: 参考:MDN 调试HTML 参考:什么是浏览器开发者工具? 参考:检查和编辑页面与样式 工具参考:标记验证服务 工具参考:直接输入验证(直接输入HTML源码进行在线检查) 目录: 1.相关快捷 ...
- static与volatile的用法
static 1.概述 static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别 ...
- 解决配置Windows Update失败问题
大家都清楚电脑总是需要更新一些补丁,不过,很多系统用户发现更新了补丁之后,开机会出现windows update更新失败的情况,提示“配置Windows Update失败,还原更改,请勿关闭计算机”信 ...
- Adobe XD 介绍
Adobe XD 关于XD这个软件我也是经过别人介绍才知道的,刚出来每两年,之前是没有中文版的,最近才更新了中文版,使用起来更加方便了. 这就是主界面,界面十分简洁但又一目了然,同时主界面还会有链接, ...
- 接口自动化框架(java)--3.get,delete请求,Excel管理多种请求类型
这套框架的报告是自己封装的 每种请求类型放入不同的sheet中,就可以避免新建太多的excel去做数据驱动. XSSFSheet类提供了一个读取sheet的方法,getSheetAt(int),通过下 ...
- c# 中HttpClient访问Https网站
c# 中HttpClient访问Https网站,加入如下代码: handler = new HttpClientHandler() ;handler.AllowAutoRedirect = true; ...
- Unity3D判断当前所在平台
Unity3D是一个跨平台的开发工具,支持的平台五花八门,常常开发一款游戏要发布到不同的平台,在不同的平台上会使用不同的代码,难道要我们各平台分别使用一套代码,单独编译一次吗?当然不用了,呵呵. ...
- 【Codeforces Round】 #432 (Div. 2) 题解
Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) A. Arpa and a research in Mexi ...