以下代码:
var d = new Date("2013-07-01");
console.log(d.toDateString());
它输出2013年3月30日的Sun Jun,这比输入的少了一天。对象怎么了?实际存储了什么日期?
答案 0 :(得分:9)
日期被解析为UTC日期,但toDateString()
输出该时间在当地时区。
试试这个
var d = new Date(2013, 6, 1); //6 instead of 7 because the mont argument is zero-based
console.log(d.toDateString());
实际存储的日期是什么?
2013-07-01 00:00:00 UTC
答案 1 :(得分:4)
从字符串中解析Date
可能会产生不同的结果,具体取决于您使用的浏览器/运行时。有a chart here列出了一些浏览器及其支持的内容。
但一般来说,像"2013-07-01"
这样的字符串被视为处于UTC的午夜。
如果您想在当地时间解析它,可以使用"2013/07/01"
。但那有点奇怪。您可能想要使用"07/01/2013"
,但这可能会被解释为1月7日或7月1日。其中任何一个仍然是特定于实现的。
如果你想要一个通用的“无处不在”的解决方案,你有几个不同的选择:
不要解析它。使用接受整数的构造函数。
var d = new Date(2013,6,1); // watch out for the zero-based month
console.log(d.toDateString());
// output: "Mon Jul 01 2013"
使用此代码,存储的实际UTC时间将根据您自己的时区而变化。但由于.toDateString()
也考虑了这段时间,所以你应该没问题。
将其解析为UTC,显示它为UTC / GMT:
var d = new Date("2013-07-01");
console.log(d.toUTCString());
// output: "Mon, 01 Jul 2013 00:00:00 GMT"
但是这个输出可能比你想要的更多,并且它在各种浏览器中看起来可能仍然不同。
使用moment.js库,您可以根据需要精确控制格式。
var m = moment("2013-07-01", "YYYY-MM-DD"); // explicit input format
console.log(m.format("ddd MMM DD YYYY")); // explicit output format
// output: "Mon Jul 01 2013"
恕我直言,这是最好的解决方案。但它确实需要您使用库。
答案 2 :(得分:3)
选项4
这种方法效果很好,不需要第三方库。
var parts ='2013-07-01'.split('-');
var mydate = new Date(Date.UTC(parts[0],parts[1]-1,parts[2])); //please put attention to the month