【问题标题】:Convert dd-mm-yyyy string to date将 dd-mm-yyyy 字符串转换为日期
【发布时间】:2011-11-01 08:47:57
【问题描述】:

我正在尝试使用以下方法将 dd-mm-yyyy 格式的字符串转换为 JavaScript 中的日期对象:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val() 包含格式为 dd-mm-yyyy 的日期。 当我执行以下操作时,我得到“无效日期”:

alert(f);

这是因为“-”符号吗?我该如何克服这个问题?

【问题讨论】:

  • 所有日期都会发生这种情况,还是特别是某个日期?

标签: javascript date


【解决方案1】:

以“-”分割

将字符串解析成你需要的部分:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

使用正则表达式

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

为什么不使用正则表达式?

因为您知道您将处理由三部分组成的字符串,用连字符分隔。

但是,如果您要在另一个字符串中查找相同的字符串,则可以使用正则表达式。

重复使用

因为您在示例代码中多次执行此操作,并且可能在代码库的其他地方,将其包装在一个函数中:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

用作:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

或者如果你不介意在你的函数中使用 jQuery:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

用作:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

现代 JavaScript

如果你能够使用更现代的 JS,数组解构也是一个不错的选择:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

【讨论】:

  • 打败了我......但我仍然使用 DateJs。由于栅栏柱错误,这并不完全正确。月份是 0-11 所以你需要减去 1. f = new Date(from[2], from[1]-1, from[0]);
  • 选择的答案存在错误,该错误会产生错误的日​​期。太棒了!
  • 干杯 @kasdega - 刚刚编辑过...!
  • @AdrianLynch 如何在javascript中将“Month dd, yyyy”转换为“MM/dd/yyyy”?
  • @Adrian Lynch 现代 JavaScript 选项很棒!谢谢。
【解决方案2】:

正则表达式示例:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

【讨论】:

  • 同样采用 / 的修订版是分隔符和由 2 位数字(或任何大于 1 的计数)组成的年份:replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
  • 为什么这应该是@AdemirNuno 的选定答案?为什么对已知格式的字符串使用 RegEx?您不是在寻找模式,您知道第一个数字是日期,第二个数字是月份,第三个数字是年份。在这种情况下,RegEx 是错误的工作工具。
  • 采用非数字分隔符、不带前导零的日期和 2 位或 4 位数字年份的修订版:new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") );en.wikipedia.org/wiki/Date_format_by_country
  • 这家伙太会练习了,谢谢。我的日期格式随时间一起出现,所以我将其重新编码为:'new Date("13-01-2011".replace(/(\d{2})-(\d{2})-(\w)/ , "$2/$1/$3") );'对吗?
  • @NeerajSingh 如何在javascript中将“Month dd, yyyy”转换为“MM/dd/yyyy”?
【解决方案3】:

另一种可能性:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

匹配数字并重新排序

【讨论】:

  • 原来的问题也指定了“dd-mm-yyyy”,而不是“mm-dd-yyyy”,所以它仍然是错误的(但只是)。
  • @epascarello 如何在javascript中将“Month dd, yyyy”转换为“MM/dd/yyyy”?
  • var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
【解决方案4】:

使用moment.js 示例:

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)

【讨论】:

  • moment(from, "DD-MM-YYYY").toDate()
【解决方案5】:
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

【讨论】:

  • 你得到的是 Date.parseDate 吗?
  • @kasdega 抱歉,我在考虑 $.datepicker.parseDate,现在修复它:)
  • 您应该使用$.datepicker.parseDate("dd-mm-yy", from); 正确解析24-01-2017 之类的日期,查看api.jqueryui.com/datepicker 上的日期选择器文档
【解决方案6】:

使用这种格式:myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00

【讨论】:

  • 你从哪里得到parseDate 函数?那是原生 javascript 函数吗?
  • 对不起,我该如何实现?我也需要格式为 dd-mm-yy
  • parseDate 是一个原生的 JS 函数。欲了解更多信息,请参阅:xaprb.com/articles/javascript-date-parsing-demo.html
  • @Diodeus...真的是原生的吗? ff 和 chrome 怎么会抛出错误?
  • @Diodeus 即使进行了最后一次编辑,这对我来说也不太适用(至少使用 Chrome)。它将日期设置为'2011-01-03',将UTC 时间设置为00:00:00。因此,如果用户的时区小于 UTC,则实际上是前一天。
【解决方案7】:

您还可以在Date() 对象的括号内写一个日期,如下所示:

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

【讨论】:

  • @AmitSengar 如何在javascript中将“Month dd, yyyy”转换为“MM/dd/yyyy”?
【解决方案8】:

接受的答案有点错误

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

考虑日期选择器是否包含“77-78-7980”,这显然不是有效日期。这将导致:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

这可能不是我们想要的结果。

MDN 网站上解释了原因:

如果 Date 被调用为具有多个参数的构造函数,如果值大于它们的逻辑范围(例如,13 作为月份值或 70 作为分钟值),则将调整相邻值。例如。 new Date(2013, 13, 1) 等价于new Date(2014, 1, 1)


解决问题的更好方法是:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

这使您可以处理无效输入。

例如:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}

【讨论】:

    【解决方案9】:

    就我而言

    new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))
    

    结果:2015 年 11 月 2 日星期一 04:40:13 GMT+0100 (CET) 然后我使用 .getTime() 以毫秒为单位工作

    【讨论】:

      【解决方案10】:

      您可以使用外部库来帮助您。

      http://www.mattkruse.com/javascript/date/source.html

      getDateFromFormat(val,format);
      

      另见:Parse DateTime string in JavaScript

      【讨论】:

      • 如何在 javascript 中将 myDate = '20/06/17' 转换为 '20/6/2017 00:00:00' 格式?
      【解决方案11】:

      查看Datejs 了解所有与日期相关的小问题。您也可以通过 parseDate 函数解决此问题

      【讨论】:

        【解决方案12】:

        你可以:

        var f = new Date(from.split('-').reverse().join('/'));
        

        【讨论】:

          【解决方案13】:

          你可以使用正则表达式。

          var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
          if (result) {
              from = new Date(
                  parseInt(result[3], 10), 
                  parseInt(result[2], 10) - 1, 
                  parseInt(result[1], 10)
              );
          }
          

          【讨论】:

          • 生成错误的月份!月份从零开始,而不是从一开始。所以如果你是一月,你的会是二月。
          • @epascarello - 忘记了 Date API 有多蹩脚。
          • @ChaosPandion : 如何在 javascript 中将 myDate = '20/06/17' 转换为 '20/6/2017 00:00:00' 格式?
          【解决方案14】:

          let dateString  = '13-02-2021' //date string in dd-mm-yyyy format
          
          let dateArray = dateString.split("-");
          //dateArray[2] equals to 2021
          //dateArray[1] equals to 02
          //dateArray[0] equals to 13
          
          // using template literals below
          
          let dateObj = new Date(`${dateArray[2]}-${dateArray[1]}-${dateArray[0]}`);
          
          // dateObj equals to Sat Feb 13 2021 05:30:00 GMT+0530 (India Standard Time)
          
          //I'm from India so its showing GMT+0530

          P.S :请始终参考文档了解基础知识,MDNDevDocs

          【讨论】:

            【解决方案15】:
            new Date().toLocaleDateString();
            

            就这么简单,只需将你的日期传递给 js 日期对象

            【讨论】:

            • 您的意思是在 Date 构造函数中传递日期字符串,例如 new Date('30/12/2018').toLocaleDateString()??返回 无效日期
            • 用户日期发生了什么?
            猜你喜欢
            • 1970-01-01
            • 2018-05-19
            • 1970-01-01
            • 1970-01-01
            • 2014-08-09
            • 2018-03-27
            • 1970-01-01
            • 1970-01-01
            • 2014-05-02
            相关资源
            最近更新 更多