Javascript日期:一场噩梦

时间:2018-12-12 20:39:26

标签: javascript date

我知道在任何环境下处理日期都可能会造成混乱,但是我陷入了噩梦,因为它的功能应该是一件琐碎的工作。 我想用一些不同的方式来处理一些日期,但是我得到了错误或错误的结果。
此后,我报告一个非常简单的示例来测试执行情况;这里的目标是获取当前月份的开始日期,只是为了显示发生了什么:

function DateAdjust() {
var newdate   = new Date();         //1: 2018-12-12T21:00:20.099Z
newdate = newdate.setDate(1);       //2: 1543698020099
newdate=Date(newdate);                  //3: Wed Dec 12 2018 21:01:43 GMT+0000 (Ora standard dell’Europa occidentale)
var d = newdate.getDate();          //4: newdate.getDate is not a function

}

4行,3个意外结果(如Firefox的调试器所示):
1.开始日期没有星期几,没有时区
2.设置日期,结果以毫秒为单位转换(为什么?);我不知道这是否正确。
3.转换为字符串会得到原始日期,未经修改(为什么?),但带有星期几和时区
4.尝试获取日值会引发错误(为什么?)

我的环境:
赢得7个32位SP1
Firefox 63.0.3(32位)
jquery-2.2.4.min.js

我知道这些问题很无聊,但希望有人能花几分钟时间清除我的想法。

3 个答案:

答案 0 :(得分:3)

关于第1行,最后的Z是ISO 8601中UTC的时区名称(请参见Wikipedia)。

  

如果时间以UTC表示,则在时间后直接添加一个Z,不能带空格。 Z是零UTC偏移量的区域标记。因此,“ 09:30 UTC”表示为“ 09:30Z”或“ 0930Z”。 “ 14:45:15 UTC”将是“ 14:45:15Z”或“ 144515Z”。

关于第2行,请参见setDate上的MDN文章(重点是我的):

  

UTC 1970年1月1日00:00:00与给定日期之间的毫秒数( Date对象也已更改)。

因此,您只需忽略返回值即可看到您可能期望的“正确”行为:

var newdate = new Date(); //1: 2018-12-12T21:00:20.099Z
newdate.setDate(1);       //2: 1543698020099
console.log(newdate);     //3: 2018-12-01T21:00:20.099Z

关于第3行,请参见Date上的MDN文章(重点是我的):

  

注意:JavaScript Date对象只能通过调用来实例化   JavaScript Date作为构造函数:作为常规函数调用   (即不使用new运算符)将返回字符串而不是    Date对象;与其他JavaScript对象类型不同,JavaScript Date   对象没有文字语法。

关于第4行,上面的内容也解释了此错误,因为newdate现在是字符串,而不是Date对象。


对于它的价值,我同意其他评论者的意见。与许多其他现代语言相比,JavaScript的日期函数非常混乱。我强烈建议您使用momentluxondate-fns之类的库。它将使您的生活更加轻松。

答案 1 :(得分:1)

我建议您使用moment.js

但是您的代码有两个问题:

1-

newdate = newdate.setDate(1);

setDate会原位改变newDate,并在几毫秒内返回它,而不是新的Date对象。如果您只想设置日期,请执行以下操作:

newdate.setDate(1);

2-

newdate=Date(newdate);

不太确定为什么要尝试获取新的Date对象,但是需要新的Date对象,否则它将只是一个字符串

newdate= new Date(newdate);

修复问题1应该消除对问题2代码的需要

答案 2 :(得分:0)

var newdate   = new Date();  // 1
console.log(typeof newdate, newdate); // object Wed Dec 12 2018 23:00:44 GMT+0200 (Eastern European Standard Time)
newdate = newdate.setDate(1); // 2    
console.log(typeof newdate, newdate); //number 1543698085383
newdate=Date(newdate);        //3       
console.log(typeof newdate, newdate);  //string Wed Dec 12 2018 23:04:44 GMT+0200 (Eastern European Standard Time)
var d = newdate.getDate();       // 4
console.log(typeof d, d); // 
  1. 日期类型已分配给对象。
  2. 编号已分配给newdate。滴答声
  3. 返回字符串
  4. string.getDate()未定义,因此未定义。

希望有帮助。