我希望能够将各种日期格式转换为单一格式,即yyyy-mm-dd,例如:
20-10-1975 -> 1975-10-20 (dd-mm-yyyy -> yyyy-mm-dd)
01-25-1961 ->1961-01-25 (mm-dd-yyyy -> yyyy-mm-dd)
1991-10-25 -> 1991-10-25 (yyyy-mm-dd remains yyyy-mm-dd)
如果可能,也可以使用时间组件,例如:
20-10-1975 13:15:22 -> 1975-10-20 13:15:22
原因是我希望能够在日期上对数组进行排序,但有时我必须处理各种我无法控制的格式。
是否有实现这一目标的功能?
PS我知道有时日期可能不明确,例如6-5-2015可能是5月6日或6月5日,但只要排序有效,我就可以了。
答案 0 :(得分:3)
您可以查看Intl.DateTimeFormat。它可能对你有所帮助,但从未使用它,我无法帮助你。
对于简单的情况,您可以在字符串'split
的帮助下手动完成。
您必须为您想要使用的每种不同格式实现解析器。
这是一个简单的例子。我选择通过Date来使解析和格式独立,但您可以选择重新排序部分。
function parse(dateString){
var parts = dateString.split("-");
return new Date(parts[2], parts[1], parts[0]);
}
function format(date){
var month = date.getMonth();
var day = date.getDay();
return [
date.getFullYear(),
month > 9 ? month : "0" + month,
day > 9 ? day : "0" + day
].join("-");
}
var date = parse("20-10-1975");
console.log(format(date));
但是,我建议使用一个可以节省一些时间的库,并以额外的依赖为代价为您提供更大的灵活性。 例如,操纵日期的最着名的图书馆之一是moment.js。 以下是如何使用它的示例。
var ex1 = moment("20-10-1975", "DD-MM-YYYY")
.format("YYYY-MM-DD");
console.log(ex1);
var ex2 = moment("01-25-1961", "MM-DD-YYYY")
.format("YYYY-MM-DD");
console.log(ex2);
var ex3 = moment("1991-10-25", "YYYY-MM-DD")
.format("YYYY-MM-DD");
console.log(ex3);
var ex4 = moment("20-10-1975 13:15:22", "YYYY-MM-DD HH:mm:ss")
.format("YYYY-DD-MM HH:mm:ss");
console.log(ex4);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.min.js"></script>
如果您想尝试匹配多种格式(因为它似乎是您的情况),您也可以这样做。只需提供momentjs
尝试识别字符串的顺序。
这是一个例子。
function formatDate(dateStr, inputFormats, outputFormat){
// Format without the hours, minutes and seconds.
inputFormats = inputFormats || [
"YYYY-MM-DD",
"DD-MM-YYYY",
"MM-DD-YYYY"
];
outputFormat = outputFormat || "YYYY-MM-DD";
// Try to match without the hours, minutes and seconds.
var mDate = moment(dateStr, inputFormats, true);
if(mDate.isValid()){
// If that worked, give the result without them.
return mDate.format(outputFormat);
}
// Create format with hours, minutes and seconds.
var extendedInputFormats = inputFormats.map(function(f){
return f + " HH:mm:ss";
});
// Try to match with hours, minutes and seconds.
mDate = moment(dateStr, extendedInputFormats, true);
if(mDate.isValid()){
// If that worked, give the result with them.
return mDate.format(outputFormat + " HH:mm:ss");
}
}
console.log("20-10-1975 =>", formatDate("20-10-1975"));
console.log("01-25-1961 =>", formatDate("01-25-1961"));
console.log("1991-10-25 =>", formatDate("1991-10-25"));
console.log("20-10-1975 13:15:22 =>", formatDate("20-10-1975 13:15:22"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.min.js"></script>