繁体   English   中英

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

[英]Convert dd-mm-yyyy string to date

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

这是因为'-'符号吗? 我怎样才能克服这个问题?

在“-”上拆分

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

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

正则表达式示例:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$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示例:

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

接受的答案有点错误

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
}

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

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

就我而言

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() 来处理毫秒

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

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

getDateFromFormat(val,format);

另请参阅: 在 JavaScript 中解析日期时间字符串

你可以:

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

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

 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

PS:始终参考文档以了解基础知识、 MDNDevDocs

您可以使用正则表达式。

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)
    );
}
new Date().toLocaleDateString();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM