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
}

 總結一下這次的教訓:再小的功能也不能放過測試,再短的代碼也不能想當然。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM