【问题标题】:Javascript how to parse year String to date with zero timeJavascript如何以零时间解析年份字符串
【发布时间】:2016-04-25 03:45:17
【问题描述】:

我想将'2015' 字符串解析为Date

问题是由于冬季时间和时区而调整一小时。 是否可以得到:

Fri Jan 01 2010 00:00:00 当我做 new Date("2010")moment("2010")

在以下情况下:

Fri Jan 01 2010 01:00:00 GMT+0100 (W. Europe Standard Time)

我希望永远是00:00

编辑

未提及:就我而言,我不知道以哪种格式获取日期字符串。它可以是yearyear monthyear month day hours 等。我要问的是如何格式化字符串到日期,所有未知值将是:01 for days and months00 for hours and minutes

【问题讨论】:

标签: javascript date datetime momentjs


【解决方案1】:

使用moment,您可以:

moment("2015", "YYYY");
// 2015-01-01T00:00:00+01:00

如果您需要使用本地时间,而如果您想使用utc,您可以:

moment.utc("2015", "YYYY");
// 2015-01-01T00:00:00+00:00
在您发表评论后

编辑

您可以通过一系列格式使用moment parsing

var s = "2015";
moment(s, ["YYYY", "YYYY MMMM"]);     // 2015-01-01T00:00:00+01:00
moment.utc(s, ["YYYY", "YYYY MMMM"]); // 2015-01-01T00:00:00+00:00
s = "2010 February";
moment(s, ["YYYY", "YYYY MMMM"]);     // 2010-02-01T00:00:00+01:00
moment.utc(s, ["YYYY", "YYYY MMMM"]); // 2010-02-01T00:00:00+00:00

编辑 #2 使用moment,您可以使用:

moment(s, ["YYYY MM DD HH:mm:ss", "YYYY MMMM DD HH:mm:ss"]);

例如:

function testMoment(s){
  var d = moment(s, ["YYYY MM DD HH:mm:ss", "YYYY MMMM DD HH:mm:ss"]);
  console.log( d.format() );
}

testMoment("2010");             // 2010-01-01T00:00:00+01:00
testMoment("2010 02");          // 2010-02-01T00:00:00+01:00
testMoment("2010 Feb");         // 2010-02-01T00:00:00+01:00
testMoment("2010 February");    // 2010-02-01T00:00:00+01:00
testMoment("2010 02 03");       // 2010-02-02T00:00:00+01:00
testMoment("2010 Feb 03");      // 2010-02-03T00:00:00+01:00
testMoment("2010 Feb 3");       // 2010-02-03T00:00:00+01:00
testMoment("2010 February 03"); // 2010-02-03T00:00:00+01:00
testMoment("2010 February 3");  // 2010-02-03T00:00:00+01:00
testMoment("2010 02 03 04");    // 2010-02-03T04:00:00+01:00
// etc...

【讨论】:

  • 问题是我不知道确切的格式,我得到什么,例如我能得到,"2010 February"
  • @Edgar 我已经更新了我的答案以管理多种格式。
  • 我在非常通用的组件中使用它,一旦它可以接收像"2004" 这样的字符串,然后是"2001 01 02" 等。我只得到带有日期的字符串,没有格式类型。
  • 您是否有一组可能的输入格式?我知道您可以收到不同的格式,但这可能会导致您出现问题:2001 01 02 应该如何解释?它可以是1st February 20012nd January 2001 :(
  • 它总是像:year month day hour minutes ...,只是并不总是完整的数据
【解决方案2】:

您可以像这样在Date 构造函数中设置此信息:

new Date(2010, 0); // params: year, month

或者如果您需要从字符串创建日期:

var year = "2010";
new Date(parseInt(year), 0);
new Date(year + "-01-01");

【讨论】:

  • 不确定它到底做了什么new Date(year + "/1");,但它确实有效。谢谢
  • @Edgar——它“起作用”纯粹是偶然的。它会创建一个类似“2010/1”的字符串,它不是format supported by ECMA-262,因此实现可能会退回到他们喜欢的任何解析算法,包括将其视为无效字符串并返回无效日期。
  • @madox2 新变化的问题是它将支持 "2010 02" string.date 。主要问题是我不确定我会收到什么格式的字符串。
【解决方案3】:

您可以为此创建一个包装器。

注意:当你做new Date()时,你也会得到time,但是当你像new Date(yyyy,mm,dd)一样做时,不会添加时间,时间总是00:00:00

function createYearStartDate(year){
  return new Date(year, 0,1);
}

(function(){
  var d1 = createYearStartDate("2010")
  console.log(d1)
})()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 2012-11-18
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-01-30
    相关资源
    最近更新 更多