将具有完整月份名称和时间的日期转换为 ISO 日期

Convert date with full month name and time to ISO date

我有格式为 02 December 2016 18:00pm 的日期和时间戳。

这是由 jQuery 选择器生成的:

"datestamp": $('span.article_info__published').text(),

如何将其转换为 2007-07-24T12:50:00+01:00 格式?

如果可能的话,我想在同一条线上完成。否则它需要适应这种结构...

result = {
    "other": $('div.article__header h1').text(),
    "datestamp": $('span.article_info__published').text(),
    "more": $('meta[name="twitter:image"]').attr("content"),
    "assorted": $('figcaption.caption').text(),
};

(我不记得目标格式的名称...我记得是 ISO 8601?)

更新: 以下returns "invalid date"...

var myDate = new Date("02 December 2016 18:00pm");

document.write(myDate);

您需要先解析字符串以获取其组成部分。然后您可以生成一个 Date 并使用它的方法生成合适的字符串,或者您可以手动重新格式化该字符串。两种方法都非常相似。

我不清楚你为什么要时区偏移。您可以独立获得它,但如果您只是将所有日期传输为 UTC 和 ISO 8601,那么您可以只采用主机时区偏移量。如果 UTC 没问题,那么您只需要解析为日期并使用 toISOString.

将时间指定为“18:00pm”是不常见的,pm部分是多余的。通常它会被指定为“1800hrs”、“18:00”或“6:00 pm”。

// Reformat string, using Date object for 
// host timezone offset only
function reformatDate(s) {
  function z(n){return ('0'+n).slice(-2)}
  var b = s.match(/\d+|[a-z]+/gi);
  var months = ['jan','feb','mar','apr','may','jun',
                'jul','aug','sep','oct','nov','dec'];
  var monNum = months.indexOf(b[1].substr(0,3).toLowerCase());
  // Host timezone offset for given date and time
  var tzOffset = new Date(b[2], monNum - 1, b[0], b[3], b[4]).getTimezoneOffset();
  var tzSign = tzOffset > 0? '-' : '+';
  tzOffset = Math.abs(tzOffset);
  return b[2] + '-' +
         z(monNum) + '-' +
         b[0] + 'T' + 
         b[3] + ':' +
         b[4] + tzSign +
         z(tzOffset/60 | 0) + ':' +
         z(tzOffset%60);
}

// Reformat string using Date object for 
// parts and host timezone offset
function reformatDate2(s) {
  function z(n){return ('0'+n).slice(-2)}
  var b = s.match(/\d+|[a-z]+/gi);
  var months = ['jan','feb','mar','apr','may','jun',
                'jul','aug','sep','oct','nov','dec'];
  var monNum = months.indexOf(b[1].substr(0,3).toLowerCase());
  var d = new Date(b[2], monNum - 1, b[0], b[3], b[4]);
  // Host timezone offset for given date and time
  var tzOffset = d.getTimezoneOffset();
  var tzSign = tzOffset > 0? '-' : '+';
  tzOffset = Math.abs(tzOffset);
  return d.getFullYear() + '-' +
         z(d.getMonth() + 1) + '-' +
         z(d.getDate()) + 'T' + 
         z(d.getHours()) + ':' +
         z(d.getMinutes()) + tzSign +
         z(tzOffset/60 | 0) + ':' +
         z(tzOffset%60);
}

var s = '02 December 2016 18:00pm';

console.log(reformatDate(s));
console.log(reformatDate2(s));

如您所见,您实际上只使用日期来获取时区偏移量,其余值可以按原样使用,但月份除外,在两种情况下都必须将其转换为数字.

还有许多库可以帮助解析和格式化字符串,例如 moment.js (large, widely used, fully functional) and fecha.js(小巧实用 parser/formatter)。在这两种情况下,您都可以根据需要解析字符串并对其进行格式化,例如使用 fecha.js:

var s = '02 December 2016 18:00pm';
// Create a Date
var d = fecha.parse(s, 'DD MMMM YYYY HH:mm');
// Format string
console.log(fecha.format(d, 'YYYY-MM-DDTHH:mmZZ'));

parse 和 format 可以是一个语句,但比 2 个更清晰。使用 moment.js(对链接方法有更好的支持):

moment(s, 'DD MMMM YYYY HH:mm').format('YYYY-MM-DDTHH:mmZZ');

为了将字符串解释为转换日期,我需要先从字符串后面删除时间 "pm"。

var date = "02 December 2016 18:00pm"

date = date.slice(0, -2);

var myDate = new Date(date);

document.write(myDate);