将dd-mm-yyyy字符串转换为日期


184

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

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


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

Answers:


325

分割为“-”

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

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

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

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

3
干杯@kasdega-不久前编辑!
阿德里安·林奇

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

1
@Adrian Lynch现代JavaScript选项很棒!谢谢。
亚历山大·里贝罗

134

正则表达式示例:

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

8
还要进行的修订/是定界符,并用2位数字(或大于1的任何数字)组成的年份:replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
为什么要选择@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
PaulH 2015年

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

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

15

另一种可能性:

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

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

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes

7

使用moment.js示例:

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

1
moment(从“ DD-MM-YYYY”开始)
.toDate


4

您还可以在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'5

3

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


1
parseDate从哪里获得该功能的?那是本机javascript函数吗?
约瑟夫·席尔伯

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

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

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

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

3

就我而言

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()以毫秒为单位工作


3

接受的答案有点错误

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
}


1

看看 Datejs所有这些琐碎日期相关的问题。你可以通过parseDate功能解决了这个过


0

您可以使用Regexp。

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年

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.