在javascript中将各种日期格式转换为yyyy-mm-dd

时间:2016-06-18 11:20:54

标签: javascript

我希望能够将各种日期格式转换为单一格式,即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日,但只要排序有效,我就可以了。

1 个答案:

答案 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>