使用仅年份创建日期对象

时间:2017-12-27 14:18:29

标签: javascript date

我习惯使用第四种语法from MDN作为Date来创建new Date(year, month, day, hours, minutes, seconds, milliseconds);个对象但是最近我尝试设置一个Date个对象只有一年(如new Date(2017))但正如您所料,它被视为value并将年视为毫秒数。

有没有什么方法可以在不改变语法的情况下轻松使用年份并期望正确设置日期?

4 个答案:

答案 0 :(得分:2)

始终使用long (2+ args) constructor避免任何问题。如果您只想指定年份,请将month参数设置为0(1月):

var d = new Date(2017, 0);
console.log(d, d.getFullYear(), d.getMonth(), d.getDate());

关于shorter (1 arg) constructor:它接受字符串或数字(其他任何东西都转换为数字)。数字被视为自UNIX纪元以来的毫秒数,因此new Date(2017)从1970-01-01开始是2.017秒。

另一方面,字符串可能位于one of these formats

  

此格式包含仅限日期的表格:

     

YYYY
  YYYY-MM
  YYYY-MM-DD

     

[...]

     

如果缺少MM或DD字段,则使用“01”作为值。如果   HH,mm或ss字段不存在“00”用作值和   缺席的sss字段的值是“000”。

虽然第一个选项似乎与您想要的行为相匹配,但它会导致比解决的问题更多的问题。 JavaScript规范和实现不确定时区:

  

ES5
  缺席时区偏移的值为“Z”。

  

ES6
  如果不存在时区偏移,则将日期时间解释为   当地时间。

因此,以下代码可以根据实现生成不同的日期:

var d = new Date("2017");
console.log(d, d.getFullYear(), d.getMonth(), d.getDate());

答案 1 :(得分:1)

如果您传递的是单个参数(数字字符串),则按照doc

进行传递
  

<强>值

     

整数值,表示自1月1日以来的毫秒数,   1970 00:00:00 UTC,忽略了闰秒(Unix Epoch;但请考虑   大多数Unix时间戳功能以秒为单位计算。)

     

<强> dateString

     

表示日期的字符串值。字符串应采用格式   由Date.parse()方法识别(符合IETF的RFC 2822   时间戳以及ISO8601的版本。

另据doc

  

如果提供了至少两个参数,则缺少参数   设置为1(如果缺少一天)或0设置为所有其他。

您可以再传递一个参数0null(或您要设置的实际值)

new Date(2017,0);

<强>演示

&#13;
&#13;
var date = new Date(2017,0);
console.log( date );
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以传递null作为第二个参数:

new Date(2017, null);

但是,如果不知道如何解释缺失值的细节,您认为现在会发生什么?是否会使用当前月,日,小时等初始化日期?还是别的什么?

更好地明确并传递所有参数,以便您知道代码在半年后的作用。

答案 3 :(得分:0)

我有另一个建议。您可以创建一个常规日期对象并设置它的年份。所以至少你知道期望其余的Date对象值是什么。

var year = "2014";

var date = new Date();
date.setFullYear(year);

// console.log(year) => Wed Dec 27 2014 16:25:28 GMT+0200

进一步阅读 - Date.prototype.setFullYear()