如何从非标准日期格式在 Javascript 中创建新的 Date()

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2945113/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 02:37:17  来源:igfitidea点击:

How to create a new Date() in Javascript from a non-standard date format

javascript

提问by Michel

I have a date in this format: dd.mm.yyyy

我有一个这种格式的日期:dd.mm.yyyy

When I instantiate a JavaScript date with it, it gives me a NaN

当我用它实例化一个 JavaScript 日期时,它给了我一个 NaN

In c# I can specify a date format, to say: here you have my string, it's in this format, please make a Datetime of it.

在c#中我可以指定一个日期格式,比如:这里你有我的字符串,它是这种格式,请为它制作一个日期时间。

Is this possible in JavaScript too? If not, is there an easy way?

这在 JavaScript 中也可能吗?如果没有,有没有简单的方法?

I would prefer not to use a substring for day, substring for month etc. because my method must also be capable of german, italian, english etc. dates.

我不想使用子字符串表示日,不使用子字符串表示月等,因为我的方法还必须能够使用德语、意大利语、英语等日期。

回答by CMS

You will need to create a function to extract the date parts and use them with the Dateconstructor.

您将需要创建一个函数来提取日期部分并将它们与Date构造函数一起使用。

Note that this constructor treats months as zero based numbers (0=Jan, 1=Feb, ..., 11=Dec).

请注意,此构造函数将月份视为从零开始的数字 ( 0=Jan, 1=Feb, ..., 11=Dec)。

For example:

例如:

function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // note parts[1]-1
  return new Date(parts[2], parts[1]-1, parts[0]);
}

parseDate('31.05.2010');
// Mon May 31 2010 00:00:00

Edit:For handling a variable formatyou could do something like this:

编辑:要处理可变格式,您可以执行以下操作:

function parseDate(input, format) {
  format = format || 'yyyy-mm-dd'; // default format
  var parts = input.match(/(\d+)/g), 
      i = 0, fmt = {};
  // extract date-part indexes from the format
  format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; });

  return new Date(parts[fmt['yyyy']], parts[fmt['mm']]-1, parts[fmt['dd']]);
}

parseDate('05.31.2010', 'mm.dd.yyyy');
parseDate('31.05.2010', 'dd.mm.yyyy');
parseDate('2010-05-31');

The above function accepts a formatparameter, that should include the yyyymmand ddplaceholders, the separators are not really important, since only digits are captured by the RegExp.

上面的函数接受一个格式参数,它应该包括yyyymmdd占位符,分隔符并不重要,因为 RegExp 只捕获数字。

You might also give a look to DateJS, a small library that makes date parsing painless...

你也可以看看DateJS,一个让日期解析变得轻松的小库......

回答by Andy E

It's easy enough to split the string into an array and pass the parts directly to the Date object:

很容易将字符串拆分成一个数组并将这些部分直接传递给 Date 对象:

var str = "01.01.2010";
var dmy = str.split(".");

var d = new Date(dmy[2], dmy[1] - 1, dmy[0]);

回答by Ryley

There is no built in way to manipulate dates the way you would like.

没有内置的方法可以按照您想要的方式操作日期。

The jQuery-UI datepickerhas the functionality you want, I'm sure many other libraries have something similar.

jQuery的UI日期选择您想要的功能,我相信很多其他库也有类似的东西。

$.datepicker.parseDate('dd.mm.yy', '31.12.2007');

回答by Warty

t="01.01.1970"
parts = t.split(".");
for(var i = 0; i < parts.length; i++) parts[i] = parseInt(parts[i], 10);
new Date(parts[2], parts[1]-1, parts[0]);

Date defined as (Year, Month, Date)
Date()'s month parameter takes Month in Zero based index. January = 0, february = 1, march = 2... etc

日期定义为 (Year, Month, Date)
Date() 的月份参数采用基于零的索引中的月份。一月 = 0,二月 = 1,三月 = 2...等等

Parsing the string to an int isn't necessary, but I dislike passing strings into functions and just hoping that JavaScript will "get it"... Sort of like how some people prefer ===

将字符串解析为 int 不是必需的,但我不喜欢将字符串传递给函数,只是希望 JavaScript 能够“得到它”......有点像有些人喜欢 ===

回答by test

Modified version of the accepted answer which supports value and format without 'dd' and uppercase format

已接受答案的修改版本,支持没有“dd”和大写格式的值和格式

function parseDate(input, format) {
    format = (format || 'yyyy-mm-dd').toLowerCase(); // default format
    var parts = input.match(/(\d+)/g), 
    i = 0, fmt = {};
    // extract date-part indexes from the format
    format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; });
    return new Date([parts[fmt['yyyy']], parts[fmt['mm']], parts[fmt['dd']]].filter(x => x !== undefined).join('-'));
}

parseDate('10/2018', 'MM/YYYY')

回答by mushood badulla

Building on CMS answer, I created this function to deal with a variable format

基于 CMS 答案,我创建了这个函数来处理可变格式

function parseDate(input, format) {
    format = format || 'yyyy-mm-dd'; // default format

    //Change from PHP date format to JS
    if (format == 'd/m/Y') {
      format = 'dd/mm/yyyy';
    }    
    if (format == 'd/m/Y H:i:s') {
      format = 'dd/mm/yyyy hh:ii:ss';
    }

    let date = NaN;
    if (format == 'dd/mm/yyyy') {
      let parts = input.match(/(\d+)/g),
          i = 0, fmt = {};
      // extract date-part indexes from the format
      format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = parts[i++]; });
      //create date for new format
      let createdDate = new Date(fmt['yyyy'], fmt['mm']-1, fmt['dd']);
      //check if dates are equal by comparing parts. The issue I had here was 
      //when I passed an invalid value for month, the output was adjustement to 
      //accomodate for the extra months
      if (
          createdDate.getFullYear() == fmt['yyyy'] && 
          createdDate.getMonth() == (fmt['mm']-1) && 
          createdDate.getDate() == fmt['dd']
      ) {
        date = createdDate;
      }
    }
    //same but taking into account hours minute and seccond
    if (format == 'dd/mm/yyyy hh:ii:ss') {
      let parts = input.match(/(\d+)/g),
          i = 0, fmt = {};

      // extract date-part indexes from the format
      format.replace(/(yyyy|dd|mm|hh|ii|ss)/g, 
      function(part) { fmt[part] = parts[i++]; });
      let createdDate = new Date(
       fmt['yyyy'], fmt['mm']-1, fmt['dd'], 
       fmt['hh'], fmt['ii'], fmt['ss']
      );
      if (
          createdDate.getFullYear() == fmt['yyyy'] && 
          createdDate.getMonth() == (fmt['mm']-1) &&
          createdDate.getDate() == fmt['dd'] && 
          createdDate.getHours() == fmt['hh'] &&
          createdDate.getMinutes() == fmt['ii'] && 
          createdDate.getSeconds() == fmt['ss']
      ) {
        date = createdDate;
      }
    }

    return date;
  }