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
}

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

时间: 2024-12-26 17:52:03

Swift根据日期字符串返回日期是星期几的相关文章

java和.net 处理任意格式日期字符串转日期类型,

1.SimpleDateFormat.parse 把指定格式字符串转日期类型 public static Calendar convToCalender(String str,String template){ SimpleDateFormat sdf; Date date; Calendar cltResult = Calendar.getInstance(); sdf = new SimpleDateFormat(template, Locale.getDefault()); try { d

Java 日期字符串与日期类型转换

1.SimpleDateFormat.format 把日期类型转化到指定格式字符串 public static String convToString(Calendar cld,String template){ String resultString=null; try { Date date=cld.getTime(); SimpleDateFormat sdf=new SimpleDateFormat(template,Locale.getDefault()); resultString=

Java "JSON中无分隔符日期字符串处理"

Json 中日期类型数据处理,服务端传输的日期没有分隔符,一般格式就两种,[20151212121212]即yyyyMMddhhmmss和[121212]hhmmss import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; public class test { public static void main(String[] arg

获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)

获取周的第一天,最后一天 System.out.println(getStartEndDate("2016-05-01", 1)); 获取星期的第一天和最后一天 System.out.println(getStartEndDate("2016-05-01", 0)); public static String getStartEndDate(String aDay, int type) { SimpleDateFormat df = new SimpleDateFo

java parse 带英文单词的日期字符串 转 date (转化新浪微博api返回的时间)

拂晓风起 专注前端技术cocos2d.js.flash.html5,联系:[email protected].如果读者要找腾讯工作机会,请不吝推荐简历. 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 227  文章- 0  评论- 336 java parse 带英文单词的日期字符串 转 date (转化新浪微博api返回的时间) 大家一般很少格式化或者parse带有Sun Nov等英文单词的字符串. 如果格式化英文月份的字符串,记得带上Locale.US参数,否则,JRE会按照当前地区

根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期

根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. 蕃薯耀 2016年12月30日 08:47:38 星期五 http://www.cnblogs.com/fanshuyao/ /** * 根据日期字符串获取星期几 *

javascript 字符串转日期 获取当天是星期几

服务器传回日期字符串 格式如下: 2015-01-20 12:03:12 2015-01-19 19:10:00 2015-01-19 12:00:00 2015-01-19 08:41:00 2015-01-16 12:23:46 要求 判断该日期是星期几 转成如下格式: 首先把字符串转换成日期格式 查了一些方法 下面这个最简单 var str = '2015-01-20 12:03:12'; dateStr = dateStr.replace(/-/g,'/'); var date = ne

日期(字符串转日期,日期转字符串,日期加减)

这几天在研究字符串与指定类型的转换,阴差阳错地研究起 java 的日期应用了,记录下来,希望你有帮助. 根据指定格式的字符串,转换为 Date(可研究根据指定格式的字符串,转化为其他指定的类型,如 json 转换为 javaBean) 需要使用到的特殊类:import java.text.ParsePosition;     /**      * <p>Parses a string representing a date by trying a variety of different pa

数据库中的八大函数(聚合,数字,字符串,日期和时间,条件,系统信息,加密,格式化)

一.函数    1.聚合函数        sum() avg() count() min() max()    2.数学函数        主要用于处理数字 包括整型 浮点型        /*数学函数*/        SELECT FLOOR(1.5)/*返回小于或者等于参数的最大整数*/floor向下取整        SELECT RAND()/*返回0-1的随机数*/        SELECT ROUND(RAND()*10)/*返回离round(x) x最近的整数 小数点后四舍五