【问题标题】:How to convert particilar format date to yyyy-mm-dd format in javascript如何在javascript中将特定格式的日期转换为yyyy-mm-dd格式
【发布时间】:2021-04-27 23:49:20
【问题描述】:

尝试转换日期格式但不起作用。 我的输入是 2054 年 10 月 23 日,输出应该是 2054-10-23。如何在javascript中做到这一点? 我的代码不起作用。

function formatDate(date) {
  var m = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  var d = new Date(date),
    month = '' + (d.getMonth() + 1),
    day = '' + d.getDate(),
    year = d.getFullYear();

  if (month.length < 2)
    month = '0' + month;
  if (day.length < 2)
    day = '0' + day;

  return [year, month, day].join('-');
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];

var results=formatDate(dates);

console.log(results.join('\n'),+'\n');

输出应该是

2054-10-23  
2014-07-29  
2054-05-12 
2050-06-20 
2059-12-23

【问题讨论】:

  • 在“ver”修复之后,怀疑您是否会通过23th Oct 2054获得想要的结果
  • @GetSet:不工作
  • 有人评论说要把“ver”变成“var”。而你这样做了。但不幸的是,由于某些未知原因,您还决定将日期数组传递给您的函数,该函数不适用于数组。
  • @GetSet:如何获得解决方案?
  • "DDth Mmm YYYY" 不是new Date() 接受的格式,一些阅读告诉我它需要是一个能够被Date.parse() 理解的字符串,否则我相信你需要时间库或自己手动解析并重新安排。 Date.parse("23th Oct 2054") is NaN

标签: javascript


【解决方案1】:

这是一个不使用 Date 对象的脏正则表达式解决方案:

function formatDate(date) {
  var newDates = date.map((item) => {
    var m = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var day = item.match(/\d+/)[0];
    day = day < 10 ? "0" + day : day;
    var month = m.indexOf(item.match(/\s([A-Za-z]{3})\s/)[1]) + 1;
    month = month < 10 ? "0" + month : month;
    var year = item.match(/\d{4}$/)[0];
    return `${year}-${month}-${day}`;
  });
  return newDates;
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
console.log(formatDate(dates));

【讨论】:

  • 输出应该像 2054-10-23 是 yyyy-mm-dd 格式..并检查我的问题..我将数组作为输入传递
  • 请检查..我将日期作为数组传递 var dates = ["2054 年 10 月 23 日"、"2014 年 7 月 29 日"、"2054 年 5 月 12 日"、"2050 年 6 月 20 日"、"12 月 23 日2059"]; console.log(formatDate(dates));
  • 在这种情况下,您需要将函数映射到数组上。我会再次编辑。完成。
  • 你能在函数内部映射吗
  • “函数内部的映射”是什么意思?您希望函数接收数组而不是单个日期吗?
【解决方案2】:

呃,我只是手动完成的

function formatDate(date) {
  var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  [d,m,y]=date.split(' ');
  d=d.split('').filter(a=>!isNaN(a)).join('');
  return [y,m,d].join('-');
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];

dates.forEach(a=>console.log(formatDate(a)))

【讨论】:

    【解决方案3】:

    一句话,瞬间! :)

    如果你可以去掉日期号上的 -th, -rd,你就可以使用这个很棒的库(它非常灵活和有用)。 -> https://momentjs.com/

    var dates = ["23 Oct 2054", "29 Jul 2014", "12 May 2054", "20 Jun 2050", "23 Dec 2059"];
    
    console.log(dates.map(date => moment(date, 'DD MMM YYYY').format('YYYY-MM-DD')));
    <script src="https://momentjs.com/downloads/moment.js"></script>
    <div id='html'></div>

    【讨论】:

      【解决方案4】:

      第一个问题是您将数组传递给不接受数组的函数。其次,您将无效的日期格式传递给 Date()。

      这不使用 Date()。它只是假设最后 4 位数字是年份,前 1-2 位数字是天,月份在中间。不区分大小写,并且允许使用日期格式的整月。

      function formatDate(date) {
        var m = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
        var month = String(m.indexOf(date.split(/[\s-]/)[1].slice(0, 3).toLowerCase())+1),
          day = date.split(/[^0-9]/)[0],
          year = date.slice(-4);
          
        if (month.length < 2)
          month = '0' + month;
        if (day.length < 2)
          day = '0' + day;
      
        return [year, month, day].join('-');
      }
      
      ;
      for (var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th dec 2059"], i=0; i<dates.length; i++) {
          console.log(formatDate(dates[i]));
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用以下代码。

        var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
        console.log(formatDate(dates));
        
        
        function formatDate(date) {
          var mainArr = [];
           if(!Array.isArray(date)) {
              date = [date];
           }
           for(i=0;i<date.length;i++) {
                var dateVal = date[i];
                var dateValArr = dateVal.split(' ');
                var filterDateArr = [];
                for(j=0;j<dateValArr.length;j++) {
                  var val = dateValArr[j]
                  if(j==0) { 
                    var val = dateValArr[j].replace(/\D/g, ""); 
                  }
                  filterDateArr.push(val);
                }
                var filterDate = filterDateArr.join(' ');
                var d = new Date(filterDate),
                    month = '' + (d.getMonth() + 1),
                    day = '' + d.getDate(),
                    year = d.getFullYear();
        
                if (month.length < 2) {
                    month = '0' + month;
                    }
                if (day.length < 2) {
                    day = '0' + day;
                    }
                    mainArr.push([year, month, day].join('-'));
              }
           return mainArr;
        }

        【讨论】:

          【解决方案6】:

          在您的示例中,当您需要一个字符串时,您将一个数组传递给您的函数。您还得到一个无效的日期对象,因为 Date 不接受您的格式。

          Date 将接受 ISO 日期 (2054-10-23)、短日期 (10/23/2054) 或长日期 (2054 年 10 月 23 日)。您的格式非常接近“长日期”格式。

          通过从您的日期中删除“-th”、“-nd”或“-st”,它成为一种可接受的长日期格式,您可以在初始化新的Date 时传递它:

          new Date(date.replace(/th|nd|st/, ""));
          

          您的函数现在按预期工作(假设您传递的是字符串而不是数组)。

          清理示例:

          function formatDate(date) {
            const dateObj = new Date(date.replace(/th|nd|st/, ""));
            let year = dateObj.getFullYear();
            let month = dateObj.getMonth() + 1;
            let day = dateObj.getDate();
          
            if (month.length < 2) month = "0" + month;
            if (day.length < 2) day = "0" + day;
          
            return [year, month, day].join("-");
          }
          
          var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
          dates.forEach(date => console.log(formatDate(date)));

          我建议在处理日期时使用date-fnsmoment。格式化它们变得容易得多!

          【讨论】:

            【解决方案7】:

            您正在将数组传递给函数并对单个项目进行操作,无效的字符串也传递给了 Date 对象。查看下面的代码

            function formatDate(dates) {
            var result=[]
            var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
            for (i = 0; i < dates.length; i++) {
                [d,m,y]=dates[i].split(' ');
                day=d.slice(0,d.length-2)
                month = (months.indexOf(m)+1).toString();
                year = y;
            
                if (month.length < 2)
                  month = '0' + month;
                if (day.length < 2)
                  day = '0' + day;
                result.push([year, month, day].join('-'));
            }
            return result;
            }
            
            var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
            console.log(formatDate(dates));

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-06-24
              • 1970-01-01
              • 2021-12-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多