zoukankan      html  css  js  c++  java
  • Swift根据日期字符串返回日期是星期几

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

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

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

    func getWeekDay(dateTime:String)->Int{
        let dateFmt = NSDateFormatter()
        dateFmt.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let date = dateFmt.dateFromString(dateTime)
        let interval = Int(date!.timeIntervalSince1970) 
        let days = Int(interval/86400) // 24*60*60
        let weekday = ((days + 4)%7+7)%7
        return weekday == 0 ? 7 : 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", 修正后的版本为:

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

     总结一下这次的教训:再小的功能也不能放过测试,再短的代码也不能想当然。

  • 相关阅读:
    hdu 1823 Luck and Love 二维线段树
    UVA 12299 RMQ with Shifts 线段树
    HDU 4578 Transformation 线段树
    FZU 2105 Digits Count 线段树
    UVA 1513 Movie collection 树状数组
    UVA 1292 Strategic game 树形DP
    【ACM】hdu_zs2_1003_Problem C_201308031012
    qsort快速排序
    【ACM】nyoj_7_街区最短路径问题_201308051737
    【ACM】nyoj_540_奇怪的排序_201308050951
  • 原文地址:https://www.cnblogs.com/arthurymn/p/5139824.html
Copyright © 2011-2022 走看看