【问题标题】:Javascript simple date conversionJavascript简单日期转换
【发布时间】:2013-10-04 11:00:09
【问题描述】:

我正在寻找一种使以下日期格式更具可读性的轻量级方法。

04OCT2013

我希望它输出:

4 October 2013

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 你有什么尝试吗?
  • 我自己尝试的所有东西都有点笨重:/
  • 在这里查看日期函数w3schools.com/jsref/jsref_obj_date.asp
  • 从数组中提取日期
  • 它以文本形式输出,我无法控制它最初的格式。

标签: javascript


【解决方案1】:

你首先需要解析你的字符串,然后格式化它的各个部分。您可以为此使用一些成熟的库 (there are a few),或者自己编写两个简单的函数:

var shortMonths = ["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dez"],
    longMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
function parse(datestring) {
    var date = parseInt(datestring.slice(0,2), 10),
        month = shortMonths.indexOf(datestring.slice(2,5).toLowerCase()),
        year = parseInt(datestring.slice(5,9), 10);
    return new Date(year, month, date);
}
function format(date) {
    return [date.getDate(), longMonths[date.getMonth()], date.getFullYear()].join(" ");
}

> format(parse("04OCT2013"))
"4 October 2013"

【讨论】:

  • + 替换parseInt 可能更“轻量级”。 ;-)
  • @Alex:问题中的代码有效。你确定de_date = "04OCT2013";?你尝试过另一个约会吗?你遇到了什么错误?
【解决方案2】:

受Bergi 回答的启发:

function formatDate(s) {
  s = s.toLowerCase().match(/\d+|\D+/g);
  var months = {jan:'January', feb:'February', mar:'March', apr:'April',
                may:'May', jun:'June', jul:'July', aug:'August', sep:'September',
                oct:'October', nov:'November', dec:'December'};
  return +s[0] + ' ' + months[s[1]] + ' ' + s[2]; 
}

formatDate('04OCT2013'); // 4 October 2013
formatDate('14NOV2015'); // 14 November 2015

【讨论】:

    【解决方案3】:

    你可以试试moment.js

    <script src="//cdn.jsdelivr.net/momentjs/2.0.0/moment.min.js"></script>
    
    var date = new Date("04OCT2013");
    var newDate = moment(date).format("DD MMMM YYYY");
    
    alert(newDate);
    

    Js Fiddle Demo

    【讨论】:

    • 我需要通过这个推送一个变量 (var de_date = flightInfo[0][4];)
    • 你是否包含了那个脚本moment.min.js
    • 是的,我已经包含了它
    • 您能否在 jsFiddle.net 上显示您的代码。如您所见,我的示例按预期工作。
    • 您尝试了哪种浏览器?并非所有人都能够解析"04OCT2013",并且会为无效日期生成NaN。 Opera 有,IE 可能没有。像我的问题一样手动解析它。
    【解决方案4】:
     var months= [ "January", "February", "March", "April", "May", "June", "July", "August",  "September", "October", "November", "December" ];
     var d = new Date();
     var desc = d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear();
    

    但我建议使用 date.js 甚至更好的 moment.js。

    【讨论】:

      【解决方案5】:
      var now = new Date();
      var monthNamesL = [ "January", "February", "March", "April", "May", "June",
                          "July", "August", "September", "October", "November", "December" ],
          monthNamesS = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
      
      var dateFmtd = monthNamesL[now.getMonth()] + ' ' + now.getDay() + ', ' + now.getFullYear();
      alert(dateFmtd);
      

      【讨论】:

      • OP 想要更常见的日期月年顺序,而不是以美国为中心的月日年顺序。
      【解决方案6】:

      Jsut 稍微格式化字符串并使用内置的Date type 解析:

      var myString = "04OCT2013";
      

      然后取出第一个字符,最后 4 个字符和月份,这样您就可以使用内置解析器,如下所示:

      Date.parse("Aug 9, 1995");
      

      无需创建自己的月份数组。

      【讨论】:

      • OP 似乎想要重新格式化字符串。还是需要一个 Date 对象?无论如何,依靠 Date 函数来正确解析非标准字符串是不可靠的,并且至少在某些浏览器中可能会失败。
      • @RobG 我建议你格式化字符串,然后使用解析器
      • 我理解你的做法。但是,OP 似乎需要一个格式化的字符串,您的答案将返回 ECMAScript 时间值或抛出错误,具体取决于实现。此外,没有date type,尽管有一个可以作为函数或构造函数调用的本机 Date 对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 2011-04-09
      • 2013-02-09
      相关资源
      最近更新 更多