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

时间:2010-05-31 17:39:14

标签: javascript

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

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

在c#中,我可以指定一种日期格式,比如说:这里你有我的字符串,就是这种格式,请用它来表示日期时间。

这也适用于JavaScript吗?如果没有,有一个简单的方法吗?

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

6 个答案:

答案 0 :(得分:32)

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

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

例如:

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

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

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');

以上函数接受格式参数,该参数应包含yyyy mmdd占位符,分隔符并不重要,因为只有数字被RegExp捕获。

您还可以查看DateJS,这是一个让日期解析无痛的小型库...

答案 1 :(得分:8)

将字符串拆分为数组并将这些部分直接传递给Date对象很简单:

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

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

答案 2 :(得分:7)

没有按照您希望的方式操纵日期的内置方式。

jQuery-UI datepicker具有您想要的功能,我相信很多其他库都有类似的功能。

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

答案 3 :(得分:1)

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()的month参数在Zero based index中采用Month。 1月= 0,2月= 1,3月= 2 ...等等

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

答案 4 :(得分:0)

已接受答案的修改版本,该版本支持不带“ 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')

答案 5 :(得分:0)

基于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;
  }