最近在用Phonegap开发一款app,需要用到JS中的Date对象. 发现了几个坑.

通过字符串初始化Date

假如你有一个日期字符串s, 你可以使用parse函数来得到日期:

var d = Date.parse(s);

或者,直接使用构造函数:

var d = new Date(s);

它其实使用的也是parse函数.

到目前为止一切似乎正常, 但是等等, 为何我没有地方传入s的format信息?
日期格式那么多, 我要怎么写呢?
或许js足够聪明, 能够自动识别常见的日期格式?
好吧, 抱着试试看的心态, 我使用了如下格式:

var d = new Date('2014-4-1 14:20:00');

在chrome上测试,通过!

可是,当我将app部署到iOS上, 日期显示的是一个null...
猜想还是我的s格式不够通用, Google一下, 果然, 使用如下格式后通过:

var d = new Date('2014-04-01T14:20:00');

说起来轻松无比,但是开始以为是别的问题引起的,查了好半天啊!!
原来这个格式取决于浏览器的支持.Chrome支持我之前的格式,但是iOS上的webkit引擎不支持.

使用结构化的日期构造函数

由于踩到了上面的字符串格式的坑, 心想, 还是结构化数据靠谱. 于是决定用Date的构造函数:

new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])

老老实实传入每个字段,这总不会有问题吧:

var d = new Date(2014,4,8,14,20,0);

测试通过!

但是,等等...今天是4月1号, 为何我拿上面的日期和今天相减, 换算后得到的天数是37天,而不是7天.
难道我的计算公式有误?
又是一番Google....没有错误啊

仔细看了下JS的构造函数的文档,定睛一看,尼玛,原来构造函数里的month是从0开始的,所以上面得到的日期其实是5月8号...真心给跪了,虽然我知道你想沿用C语言的习惯,但是作为上层语言,这真的很容易搞错啊.

最后, 还是老老实实用字符串表示日期了.

格式化成字符串

按照设计,我需要将日期格式化成"dd/mm/yyyy"的格式,但是,我发现Date的格式化函数依然不支持传入格式参数.
你只能使用 d.toLocalString() 之类的函数,转成本地格式. 但是,何为本地格式呢? 它决定于你所在在的地区.准确说,取决于你电脑的设置. 更准确点说, 就是没谱!!!

好在发现了一篇文章,扩展了Date的格式化功能:

JavaScript Date Format

这下, 终于可以像预期的那样格式化日期了.

var s = d.format('dd/mm/yyyy');

但是,还是觉得很坑爹有没有?

终极解决方案:使用momentjs

最后经人介绍,知道了momentjs. 这才是日期时间库应该有的样子!! 细节就不介绍了,看文档就行了. 这个库绝对值得拥有, 我已经把它添加到我的默认工具链了.
不过在使用过程中还是踩到了一个坑:

var today = when.startOf('day')

当我想通过已有的moment实例when来获取不带日期时间的新moment对象today时, 返回的today的值确实是对的.
但是, 很不幸的是, when的值也被修改了. 也就是说startOf函数其实是修改了当前对象的值,并返回当前对象.
写代码的时候想当然了,后来发现时间莫名被修改了.
为了找出这个问题,浪费了一个下午...

  • Smithk3682017-02-01 01:28

    Your goal is to breed all the different dragons available to you and enter combat against other player's dragons. efecegbccgckecgd