【问题标题】:Javascript: convert string with full month to date objectJavascript:将字符串与完整的月份转换为日期对象
【发布时间】:2016-10-04 15:38:04
【问题描述】:

我有一个字符串变量"PublishDate",然后当我使用"PublishDate.value" 检查值时,它返回一个类似

的字符串

"October 04, 2016 9:28 AM"

我需要将其转换为格式为 "10/04/2016" 的日期对象

我不确定这是如何在 javascript 中完成的:

var d = new Date("October 04, 2016 9:28 AM");
var date = d.getDate();
var month = d.getMonth();
var year = d.getFullYear();
var hours = d.getHours();
var min = d.getMinutes();   //10/04/2016
console.log(month+1+'/'+date+'/'+year);

【问题讨论】:

  • 要么你有一个日期对象,要么你有字符串"10/04/2016",你不能同时拥有两者(但你可以在不同的变量中拥有两者)
  • 你做了什么研究,你尝试了什么?在搜索引擎中使用此问题中的关键字会产生很多结果
  • 只需解析字符串并自己创建日期对象。

标签: javascript string date


【解决方案1】:

使用月份数组来获取数值,然后根据需要进行解析

var months = [
	"January",
	"February",
	"March",
	"April",
 	"May",
 	"June",
	"July",
 	"August",
 	"September",
	"October",
	"November",
	"December"
];

function pad(n) { return n<10?'0'+n:n }

var PublishDate = {
	value : "October 04, 2016 9:28 AM"
}

var parts = PublishDate.value.split(/[\s\,\:]+/);
var year  = +parts[2];
var month = months.indexOf(parts[0]);
var day   = +parts[1];

var date  = new Date(year, month, day);                  // date object
var str   = pad(month+1) + '/' + pad(day) + '/' +  year; // the string "10/04/2016"

console.log(date);
console.log(str);
.as-console-wrapper {top : 0}

【讨论】:

  • 哇实际上有一个更简单的方法^^ new Date("October 04, 2016 9:28 AM") 工作正常^^
  • @SteevePitis - 对你有好处,但它不是有效的 ISO 8601 日期,所以引擎是否能够解析它,将取决于实现,并且根本无法保证。
【解决方案2】:

首先,使用Date constructor 将该字符串日期转换为日期对象:

var d = new Date(PublishDate.value);

编辑:始终考虑浏览器可能不支持您的格式的情况。对于 Firefox,MDN 声明它将支持certain date formats:

字符串应采用 Date.parse() 方法可识别的格式 (符合 IETF 的 RFC 2822 时间戳,也是 ISO8601 的一个版本)。

IE's MSDN Javascript reference 还说:

它首先尝试使用ISO Date Format 解析日期字符串。如果 日期字符串不是 ISO 格式,JavaScript 会尝试解析 日期使用其他Other Date Formats。

另外,考虑到 MDN 本身不鼓励使用构造函数或 Date.parse() 解析字符串日期,即​​使它适用于您的特定情况:

注意: 使用 Date 构造函数解析日期字符串(以及 Date.parse,它们是等价的)强烈反对,因为 浏览器的差异和不一致。

如果您需要支持其他种类的日期格式或各种浏览器,您还可以考虑使用 Momtent.js javascript 库或使用 RegEx 进行自己的解析,例如 @RobG 和 @adeneo 的答案。


然后,您需要提取您想要的部分(月、日、年)并将它们连接成一个字符串,并以斜线作为分隔符,就像在@user3254198 的答案或@Steeve Pitis 的答案中一样:

d.getDate() + '/' 
    + (d.getMonth() + 1) + '/' 
    +  d.getFullYear()

请记住,PublishDate.value.getMonth() 方法返回从零开始的月份数字表示月份,因此如果您需要 1-12 的值,请添加 +1。

如有任何疑问,请随时咨询!祝你好运。

【讨论】:

  • 真的,您的浏览器在为日期对象输出该格式时?我的会输出 UTC 日期,如 2016-10-04T09:28:00.000Z 等?
  • 是的!减去 GMT 部分:console.log(new Date().toString()); 在我的浏览器中打印 Tue Oct 04 2016 10:36:13 GMT-0600。
  • 这还远不及October 04, 2016 9:28 AM
  • 对不起,我第一眼看到它很相似,但你是对的,它是不同的。我会更新我的答案。
  • "首先,使用 Date 构造函数将该字符串日期转换为 Date 对象:" 不是一个好主意。 OP 日期格式的解析完全依赖于实现,可能会返回正确的日期、错误的日期或无效的日期。
【解决方案3】:

// Example PublishDate result
var PublishDate = {
  value: 'October 04, 2016 9:28 AM'
};

// convert "date string" into "date object"
var date = new Date(PublishDate.value);

// build required "date string"
var dateShort = (date.getMonth() +1) + '/'
  + date.getDate() + '/'
  + date.getFullYear();

// console log to show result
console.log(dateShort);

【讨论】:

  • 需要将 + 1 添加到 date.getMonth() 部分,因为该方法返回基于零的月份数,因此它打印的是 10/4/2016 而不是 9/04/2016
【解决方案4】:

使用 Date 构造函数解析像“October 04, 2016 9:28 AM”这样的字符串完全依赖于实现,可能会导致日期不正确或无效,所以要么使用解析器(有很多可用的解析器),要么自己写一个小函数来解析字符串。

但是,如果您只是想重新格式化它,则根本不需要解析为 Date,只需重新格式化字符串即可。例如

/* Reformat a string like October 04, 2016 9:28 AM to m/d/y format
** @param {string} s - string in format MMMM DD, YYYY h:mm ap
** @returns {string} reformatted date in MM/DD/YYYY format
*/
function reformatDate(s) {
  var months = {jan:'01',feb:'02',mar:'03',apr:'04', may:'05',jun:'06',
                jul:'07',aug:'08',sep:'09',oct:'10',nov:'11',dec:'12'};
  var b = s.match(/\w+/g) || [];
  return months[b[0].toLowerCase().substr(0,3)] + '/' + b[1] + '/' + b[2];
}

console.log(reformatDate('October 04, 2016 9:28 AM'));
                

【讨论】:

    【解决方案5】:

    SO上有很多这样的问题...下次尝试搜索一下。

    var date = new Date(PublishDate.value);
    console.log((date.getDate() + '/' + (date.getMonth() + 1) + '/' +  date.getFullYear());
    

    【讨论】:

    • OP 日期格式的解析完全依赖于实现,可能会返回正确的日期、错误的日期或无效的日期。要么编写一个简单的函数,要么使用众多可用的解析器之一。
    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 2011-03-07
    • 1970-01-01
    • 2022-07-20
    • 2017-02-07
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多