关于javascript:将dd-mm-yyyy字符串转换为日期

Convert dd-mm-yyyy string to date

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

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

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

1
alert(f);

这是因为' - '符号吗? 我怎么能克服这个?


拆分" -"

将字符串解析为您需要的部分:

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

使用正则表达式

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

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

因为你知道你将使用由连字符分隔的三个部分组成的字符串。

但是,如果你在另一个字符串中寻找相同的字符串,那么正则表达式就是你要走的路。

重用

因为您在示例代码中执行此操作不止一次,并且可能在代码库中的其他位置执行此操作,所以将其包装在函数中:

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

用作:

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

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

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

用作:

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

现代JavaScript

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

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


正则表达式示例:

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


另一种可能性

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

匹配数字并重新排序


使用moment.js示例:

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

1
2
var from = $("#datepicker").val();
var f = $.datepicker.parseDate("d-m-Y", from);


就我而言

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

结果:Mon Nov 02 2015 04:40:13 GMT + 0100(CET)
然后我使用.getTime()来处理毫秒


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

1
2
3
4
5
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)


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


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

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

1
getDateFromFormat(val,format);

另请参见:在JavaScript中解析DateTime字符串


看看Datejs所有那些小日期相关的问题..您也可以通过parseDate函数解决这个问题


接受的答案有点错误

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

考虑一下datepicker是否包含"77-78-7980",这显然不是一个有效的日期。这将导致:

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

这可能不是理想的结果。

在MDN网站上解释了这个原因:

Where Date is called as a constructor with more than one argument, if values are greater than their logical range (e.g. 13 is provided as the month value or 70 for the minute value), the adjacent value will be adjusted. E.g. new Date(2013, 13, 1) is equivalent to new Date(2014, 1, 1).

解决问题的更好方法是:

1
2
3
4
5
6
7
8
9
10
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

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

例如:

1
2
3
4
5
6
7
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
}


你可以使用正则表达式。

1
2
3
4
5
6
7
8
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)
    );
}


1
new Date().toLocaleDateString();

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