我正在尝试使用以下命令将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);


这是因为带有'-'符号吗?我该如何克服?

评论

这是在所有日期还是特别是一个日期发生?

#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})/, "//"))


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

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

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

重复使用

因为在您的代码中多次这样做示例代码,或者可能在代码库中的其他地方,将其包装在一个函数中:

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])
}


用作:
现代JavaScript

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

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


评论


击败我...但我仍然使用DateJs。由于栅栏张贴错误,这并不完全正确。月是0-11,因此您需要减去1。f =新的Date(from [2],from [1] -1,from [0]);

– kasdega
11年8月22日在18:27

选择的答案带有会产生错误日期的错误。太棒了!

–epascarello
11年8月22日在19:49

干杯@kasdega-不久前编辑!

–艾德里安·林奇(Adrian Lynch)
2015年1月2日,15:21

@AdrianLynch如何在JavaScript中将“月dd,yyyy”转换为“ MM / dd / yyyy”?

– dilipkumar1007
16年5月12日在9:24

@Adrian Lynch现代JavaScript选项很棒!谢谢。

–亚历山大·里贝罗(Alexandre Ribeiro)
18年5月9日在18:05

#2 楼

正则表达式示例:

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


评论


修订版也以/为分隔符,并且以2位数字(或大于1的任何数字)组成的年份:replace(/(\ d {2})[-/](\ d {2})[-/]( \ d +)/,“ $ 2 / $ 1 / $ 3”)

–茨城
2014-12-22 17:32



为什么要选择@AdemirNuno作为答案?为什么将RegEx用于已知格式的字符串?您并不是要寻找模式,您知道第一个数字是日期,第二个是月份,第三个是年份。在这种情况下,RegEx是用于该工作的错误工具。

–艾德里安·林奇(Adrian Lynch)
15年1月2日在15:24

使用非数字定界符,不带前导零和2或4位数字年份的日期的修订:new Date(“ 23. 2. 15” .replace(/(\ d +)[^ d] +(\ d +)[^ d ] +(\ d +)/,“ $ 2 / $ 1 / $ 3”)); zh.wikipedia.org/wiki/Date_format_by_country

– PaulH
2015年2月23日在8:32

太好了,谢谢。我的日期格式带有时间,因此我将其重新编码为:'new Date(“ 13-01-2011” .replace(/(\ d {2})-(\ d {2})-(\ w)/ ,“ $ 2 / $ 1 / $ 3”));'这样对吗?

– KamuranSönecek
2015年9月29日下午6:00



@NeerajSingh如何在JavaScript中将“月dd,yyyy”转换为“ MM / dd / yyyy”?

– dilipkumar1007
16年5月12日在9:23

#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”,因此仍然是错误的(但仅是)。

– Phil M Jones
16年4月13日在10:37

@epascarello如何在JavaScript中将“月dd,yyyy”转换为“ MM / dd / yyyy”?

– dilipkumar1007
16年5月12日在9:22

var date = new Date(数字[2],数字[1] -1,数字[0]);

– Rui Nunes
17年4月13日在9:24

#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()

–拉彭科夫·弗拉基米尔(Lapenkov Vladimir)
19-10-14在9:59

#5 楼

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


评论


您要获取Date.parseDate吗?

– kasdega
11年8月22日在18:30

@kasdega对不起,我在想$ .datepicker.parseDate,现在修复它:)

– Saad Imran。
13年4月5日在15:29

您应该使用$ .datepicker.parseDate(“ dd-mm-yy”,from);正确解析日期,例如2017年1月24日,请在api.jqueryui.com/datepicker中查看datepicker文档

–安德烈·毛罗(Andrea Mauro)
17年6月1日在18:50



#6 楼

您还可以在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中将“月dd,yyyy”转换为“ MM / dd / yyyy”?

– dilipkumar1007
16年5月12日在9:22

#7 楼

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

评论


您从哪里获得parseDate函数?那是本机javascript函数吗?

–约瑟夫·西尔伯(Joseph Silber)
11年8月22日在18:09

抱歉,我该如何实施?我也需要格式为dd-mm-yy

–user559142
11年8月22日在18:12

parseDate是本机JS函数。有关更多信息,请参见:xaprb.com/articles/javascript-date-parsing-demo.html

– Diodeus-詹姆斯·麦克法兰
11年8月22日在18:51

@Diodeus ...真的是本地人吗? ff和chrome如何抛出错误?

–epascarello
2011年8月22日19:40



@Diodeus即使最后一次编辑对我也不起作用(至少使用Chrome)。它将日期设置为“ 2011-01-03”,UTC时间设置为00:00:00。因此,如果用户的时区小于UTC,则实际上是前一天。

–迈克
2014年2月23日在3:19

#8 楼

就我而言

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "--T::"))


结果:2015年11月2日星期一格林尼治标准时间+0100(CET)
然后我使用.getTime()进行工作毫秒

#9 楼

接受的答案有点儿有错误

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
}


#10 楼

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

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

getDateFromFormat(val,format);


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

评论


如何在javascript中将myDate = '20 / 06/17'转换为'20 / 6/2017 00:00:00'格式?

– Ghanshyam Lakhani
17年7月28日在11:04



#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)
    );
}


评论


产生错误的月份!月开始于零,而不是一。因此,如果您选择Jan,您会说Feb。

–epascarello
2011年8月22日19:55

@epascarello-忘记了Date API有多糟糕。

–混沌潘迪翁
11年8月22日在20:27

@ChaosPandion:如何在javascript中将myDate = '20 / 06/17'转换为'20 / 6/2017 00:00:00'格式?

– Ghanshyam Lakhani
17年7月28日在11:05

#14 楼

new Date().toLocaleDateString();


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

评论


您的意思是在Date构造函数中传递日期字符串,例如new Date('30 / 12/2018')。toLocaleDateString()吗?返回无效日期

–泰米尔女士
18-10-3在7:32

用户日期发生了什么?

–乔纳森·阿里亚斯(Jonathan Arias)
10月14日21:25