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

前端 未结 6 2077
有刺的猬
有刺的猬 2020-12-24 13:47

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

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

In c# I can specify a date format, to s

相关标签:
6条回答
  • 2020-12-24 14:12

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

    var str = "01.01.2010";
    var dmy = str.split(".");
    
    var d = new Date(dmy[2], dmy[1] - 1, dmy[0]);
    
    0 讨论(0)
  • 2020-12-24 14:17

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

    Note that this constructor treats months as zero based numbers (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 format you 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 format parameter, that should include the yyyy mm and dd placeholders, the separators are not really important, since only digits are captured by the RegExp.

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

    0 讨论(0)
  • 2020-12-24 14:19

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

    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')
    
    0 讨论(0)
  • 2020-12-24 14:25
    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

    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 ===

    0 讨论(0)
  • 2020-12-24 14:27

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

    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;
      }
    
    0 讨论(0)
  • 2020-12-24 14:33

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

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

    $.datepicker.parseDate('dd.mm.yy', '31.12.2007');
    
    0 讨论(0)
提交回复
热议问题