我知道在任何环境下处理日期都可能会造成混乱,但是我陷入了噩梦,因为它的功能应该是一件琐碎的工作。
我想用一些不同的方式来处理一些日期,但是我得到了错误或错误的结果。
此后,我报告一个非常简单的示例来测试执行情况;这里的目标是获取当前月份的开始日期,只是为了显示发生了什么:
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
我知道这些问题很无聊,但希望有人能花几分钟时间清除我的想法。
答案 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
对象只能通过调用来实例化 JavaScriptDate
作为构造函数:作为常规函数调用 (即不使用new
运算符)将返回字符串而不是Date
对象;与其他JavaScript对象类型不同,JavaScriptDate
对象没有文字语法。
关于第4行,上面的内容也解释了此错误,因为newdate
现在是字符串,而不是Date
对象。
对于它的价值,我同意其他评论者的意见。与许多其他现代语言相比,JavaScript的日期函数非常混乱。我强烈建议您使用moment,luxon或date-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); //
希望有帮助。