0使用JavaScript在日期字符串中填充日期和月份

时间:2016-01-16 00:17:42

标签: javascript date datetime

使用JavaScript有一种方法可以获取像这个9/17/2014这样的日期字符串并对其进行修改,以便日期和月份值总是用0填充,如果它们的长度是单个数字吗?

问题是分隔符/可以是任何东西。通常它会是-/所以如果它只查找那些2就可以了。

此外,日,月和年的顺序可以在任何位置。

我的最终目标是获取一个日期字符串并使其成为日期部分的长度始终为10个字符,以便我可以获取剩余的字符,如果它们存在并始终假设它们是DateTime字符串的时间部分

如果我得到9/17/2014这样的字符串,则日期部分只有9个长,如果日期是单个数字,如9/7/2014那么它只有8个长。

我正在使用这个JavaScript函数将Date字符串转换为JS Date对象。它允许任何样式分隔符以及日,月和年份的任何订单。

我的目标是修改它以允许日期字符串在日期部分后面有一个时间并将它们解析为时间片。

如果字符串包含时间部分,我将假设时间分隔符始终为:

字符串中日期和时间之间的分隔符可以是:

  1. 04/04/2016 12:23:12
  2. 之类的空间
  3. T,例如04/04/2016T12:23:12
  4. 此时可能会有也可能没有结尾ampm

    我目前的问题是日期部分有时不是10个字符的长度所以如果我可以自动0填充单个数字的日期和月份,它可能有助于最终目标。

    对此任何目标的任何帮助都表示赞赏,谢谢

      // Convert Date String into JS Date Object
      // Can parse multiple Date formats
      // stringToDate("17/9/2014", "dd/MM/yyyy", "/");
      // stringToDate("9/17/2014", "mm/dd/yyyy", "/");
      // stringToDate("9-17-2014", "mm-dd-yyyy", "-");
      stringToDate: function(d, _format, _delimiter) {
        if((d instanceof Date)){
          return d;
        }
        if(d.length > 10){
          // it might have a Time string at the end
          var dateString = d.substring(0, 10);
          console.log(dateString);
        }
    
        var formatLowerCase = _format.toLowerCase();
        var formatItems = formatLowerCase.split(_delimiter);
        var dateItems = d.split(_delimiter);
        var monthIndex = formatItems.indexOf("mm");
        var dayIndex = formatItems.indexOf("dd");
        var yearIndex = formatItems.indexOf("yyyy");
        var month = parseInt(dateItems[monthIndex]);
        month -= 1;
        var formatedDate = new Date(dateItems[yearIndex], month, dateItems[dayIndex]);
        return formatedDate;
      },
    

5 个答案:

答案 0 :(得分:1)

一些建议 - 如果适合您的情况,请使用moments.js

我经常使用一组正则表达式。下面的示例执行此操作,并且只附加任何余数以用作日期字符串。:

function cleanDate(d){ // strips leading 0s from php date and converts dashes to slashes
   function pad(v){ if(parseInt(v,10) >= 10) return v; return "0"+v;}
   var dM = /0?(\d{1,2})[-\/]0?(\d+)[-\/](\d{4})(.*)/.exec(d); //assume month/date/year
   if(dM) return pad(dM[1]) +'/'+ pad(dM[2]) +'/'+ dM[3]+dM[4];

   dM = /(\d{4})[-\/]0?(\d+)[-\/]0?(\d+)(.*)/.exec(d); //assume year-month-date
   if(dM) return pad(dM[2]) +'/'+ pad(dM[3]) +'/'+ dM[1]+dM[4];

   return d;// cannot do anything with it
}

答案 1 :(得分:1)

您可以使用迭代函数填充日期:

function pad(str) {
  if (str.length === 2) return str;
  return pad('0' + str);
}

使用中介功能分隔日期组件并在必要时填充它们:

function padDate(str, delimiter) {
  return str.split(delimiter).map(function (el) {
    if (el.length < 2) return pad(el);
    return el;
  }).join(delimiter);
}

声明您希望分隔符作为padDate函数的参数。

padDate('9/17/2014', '/'); // 09/17/2014
padDate('19-7-2014', '-'); // 19-07-2014

DEMO

答案 2 :(得分:0)

在这里添加这个是一些看似相当冗长的答案。

我通常在日期格式化功能中添加以下功能。它可以简洁,因为你知道你只需要处理正整数,只需要填写0到9的数字。

function z(n){return (n<10? '0':'') + n}

然后使用它:

z(date.getMonth()+1)

另一种选择是:

function z(n){return ('0'+n).slice(-1)}

但是,我认为你重新格式化字符串然后解析它的策略效率不高,只需解析它。

答案 3 :(得分:0)

请注意,在填充时,数字可以是字符串或数字,因此需要首先进行检查以获取正确的结果

pad(n){
    if(typeof n.length != 'undefined'){ // string
      return (n.length == 1) ? "0"+n : n;
    }
    else { // number
      if (n < 10) { 
        return "0" + n;
      }
      return n;
    }
  }

答案 4 :(得分:-1)

这种替换并不像完全支持lookbehinds的正则表达式引擎那样优雅。但是,这是一种将日期和日期时间表达式中的零添加到零的单步技术。

有效地,您找出一个字符串,该字符串以一个数字开头,然后是一个非数字,或者是一个非数字之后紧跟一个数字,然后是冒号,斜线,连字符或字符串的结尾。

我仅使用捕获组,因为当我使用$00时,js似乎不喜欢它。 $10的意思是:写入第一个捕获的字符串(在这种情况下,为空字符串或非数字),然后添加零。

let dates = [
  '17/9/2014',
  '9/17/2015',
  '9-17-2016',
  '4/4/2017 2:2:2',
  '5-5-2018 12:2:59',
  '6/6/2019 2:59:59',
  '7-17-2020T1:2:3',
];

for (let i in dates) {
  document.write('<div>' + dates[i].replace(/(^(?=\d\D)|\D(?=\d(?:[:/-]|$)))/g, '$10') + '</div>');
}