Swift根据日期字符串返回日期是星期几

Swift根据日期字符串返回日期是星期几,第1张

概述最近在做的一个IOS项目中需要根据日期得出日期代表的是星期几,日期以字符串的形式获得,于是该方法可以简单描述如下: 1 2 3 4 5 6 /* * 根据日期格式字符串返回日期代表星期几 * 参数:dateTime,字符串类型,日期格式字符串,格式为"yyyy-MM-dd HH:mm:ss" * 返回值:日期代表星期几,Int类型,星期一到星期日分别表示为:1~7 */ func  getWeek

最近在做的一个IOS项目中需要根据日期得出日期代表的是星期几,日期以字符串的形式获得,于是该方法可以简单描述如下:

1 2 3 4 5 6 /* * 根据日期格式字符串返回日期代表星期几 * 参数:dateTime,字符串类型,日期格式字符串,格式为"yyyy-MM-dd HH:mm:ss" * 返回值:日期代表星期几,Int类型,星期一到星期日分别表示为:1~7 */ func getWeekDay ( dateTime : String ) - > Int

简单百度了一下,又大致浏览了一下官方api文档,得知NSDate有个timeIntervalSince1970来计算固定时间差,于是形成了第一个版本(有问题的版本):

6 7 8 9
func : String )- > Int { let dateFmt = NSDateFormatter () . dateFormat = "yyyy-MM-dd HH:mm:ss" date dateFromString ) interval !. timeIntervalSince1970 ) days = Int / 86400 ) // 24*60*60 let weekday = (( + 4 )% 7 7 return == 0 ? weekday }

在这个版本的实现中,首先要知道timeIntervalSince1970是取当前日期和1970-01-01 0点的时间差,当天是星期四,因此根据时间差算星期几时需要加4;为了保证输入年份小于1970时仍然有效,也就是说interval以及days有可能为负数,因此模7取余后,又进行了加7和模7;最后,为了调整weekday按之前约定星期一从1开始编号,需要将计算的0值转换成7,于是有了最后一行的“return weekday == 0 ? 7 : weekday”。测试一下“2016-01-17 23:58:00”,得出结果为“7”,貌似没有问题;再试一个"1969-12-31 00:00:00",得出结果3(之前说了1970-01-01时周四),也对,但是真的不对。幸亏写这个方法时是夜里23:50左右,一过零点到了下一天,问题出来了,“2016-01-18 00:01:01”竟然得出来还是7,跟17日的星期数一样!Why???!!!

在playground里调试一下发现只有interval可能有问题,仔细百度并次查看官方api文档后发现,NSDate表示的时间在内存中都是UTC时间,即0时区的时间,当需要显示时,才会根据当前系统的时区或者代码里指定的时区进行显示。以“2016-01-18 00:01:01”为例,输入值自然伴随着当前的时区(中国时区为东8区),转换成NSDate对象后就变成了UTC时间,即 “2016-01-17 16:01:01”,小时数减了8,而 timeIntervalSince1970 计算出来的时间差自然也就是2016-01-17到1970-01-01的。知道问题所在,只需修改一下interval的计算即可,变成“ interval = Int(date!.timeIntervalSince1970) + NSTimeZone.localTimeZone().secondsFromGMT",修正后的版本为:

9 10
?. description ) + NSTimeZone localTimeZone (). secondsFromGMT // 24*60*60 7 weekday 总结一下这次的教训:再小的功能也不能放过测试,再短的代码也不能想当然。

总结

以上是内存溢出为你收集整理的Swift根据日期字符串返回日期是星期几全部内容,希望文章能够帮你解决Swift根据日期字符串返回日期是星期几所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1073835.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)