最近在做的一个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
}

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

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

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

    1.SimpleDateFormat.parse 把指定格式字符串转日期类型 public static Calendar convToCalender(String str,String templ ...

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

    1.SimpleDateFormat.format 把日期类型转化到指定格式字符串 public static String convToString(Calendar cld,String temp ...

  3. javascript日期字符串和日期对象相互转换

    HTML页面间需要传递日期和时间参数的时候,如果需要对日期字符串进行时间的运算,就需要先将日期字符串转换成JS日期对象. 在js中,yyyy-MM-dd HH:mm:ss格式的日期字符串不能用来直接构 ...

  4. C# 把日期字符串转换为日期类型 (MM大写为月、小写为分钟)

    string dtStr; DateTime dtTime; 尝试把时间字符串转为DateTime格式 if (DateTime.TryParse(dtStr, out dtTime)) { //st ...

  5. js中字符串转换为日期型

    简介:字符串转日期型函数 传入一个字符串格式的日期,如何转换为日期型的.以下为转换方案. //字符串转换为日期函数,返回日期型(传入的日期格式2014-04-22) function StringTo ...

  6. c#字符串转换为日期,支持任意字符串

    文章关键字: c#字符串转换为日期 c#日期转换字符串   字符串转换日期   字符串转换为date   整数转换为字符串   浮点数转换为字符串 字符串转换为时间   将字符串转换为时间   字符转 ...

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

    Json 中日期类型数据处理,服务端传输的日期没有分隔符,一般格式就两种,[20151212121212]即yyyyMMddhhmmss和[121212]hhmmss import java.text ...

  8. js时间戳转换日期格式和日期计算

    一.时间戳转换日期 function formatDate(datetime) { // 获取年月日时分秒值 slice(-2)过滤掉大于10日期前面的0 var year = datetime.ge ...

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

    获取周的第一天,最后一天 System.out.println(getStartEndDate("2016-05-01", 1)); 获取星期的第一天和最后一天 System.ou ...

随机推荐

  1. Intellij IDE 常用设置

    1· 去除代码提示的Case sensitive(比如Sprite,键入sprite不进行任何提示) Editor->Code Completion->Case sensitive com ...

  2. grunt 入门学习

    前端工作流,Grunt上手指南 Posted@2013-04-20 7:15 a.m. CategoriesGrunt ,  javascript 我想先花点时间回忆一下作为一个前端需要做的工作(Lo ...

  3. 1393: Robert Hood 旋转卡壳 凸包

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1393 http://poj.org/problem?id=2187 Beauty Contest ...

  4. 调用线程无法访问此对象,因为另一个线程拥有该对象 [c# wpf定时器程序报的错误]

    WPF:Dispatcher.Invoke 方法,只有在其上创建 Dispatcher 的线程才可以直接访问DispatcherObject.若要从不同于在其上创建 DispatcherObject ...

  5. [kohana] kohana3.2,如何兼容PDO数据库连接方式

    由于历史原因,有个kohana3.2的站点需要搬迁到php5.5上来,但php5.5已经不支持mysql_connect()这个函数了,只能使用PDO来连接数据库. 但换上PDO之后,报了这个的一个错 ...

  6. tslib1.4编译

    准备工作:ubuntu14.04-64位+arm-linux-gcc(2014)+tslib.14 1.arm-linux-gcc下载地址:http://www.veryarm.com/arm-non ...

  7. wamp多网站配置for window 本地测试 单Ip

    网上有很多WAMP集成环境下单IP多域名虚拟主机配置的文章,自己总结了有用方法记录下来 简单的介绍一下我的系统环境:window xp  和 wamp apache2.2.8 ------------ ...

  8. 日常总结——JSP篇(补)

    序—— 初次接触JSP,写一个登录注册界面 正文—— JSP介绍:JSP通过在标准的HTML页面中插入java代码,其静态的部分无须java程序控制.每个JSP页面就是一个servlet实例, WEB ...

  9. Android例子源码非第三方实现根据字母排序的城市列表

    values 下dimens.xml <resources> <!-- Default screen margins, per the Android Design guidelin ...

  10. MD5 Checksums for R12.1.1 Rapid Install Media (文档 ID 802195.1)

    Oracle EBusiness Suite R12.1.x Rapid Installmd5 Checksums November 2011 Section      1: Overview Sec ...