0

我有格式的日期和时间戳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?)

更新:以下返回“无效日期”...

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

document.write(myDate);
4

2 回答 2

0

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

我不清楚你为什么想要时区偏移。您可以独立获得,但如果您只是将所有日期传输为 UTC 和 ISO 8601,那么您可以采用主机时区偏移量。如果 UTC 没问题,那么您只需要解析为 Date 并使用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));

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

还有许多库可以帮助解析和格式化字符串,例如moment.js(大型、广泛使用、功能齐全)和fecha.js(小型且功能强大的解析器/格式化程序)。在这两种情况下,您都可以根据需要解析字符串并对其进行格式化,例如使用 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'));

解析和格式可以是一个语句,但它更清楚 2. 使用 moment.js(对链接方法有更好的支持):

moment(s, 'DD MMMM YYYY HH:mm').format('YYYY-MM-DDTHH:mmZZ');
于 2018-07-09T00:26:26.017 回答
0

为了使字符串可以解释为转换日期,我需要先从字符串后面删除时间“pm”。

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

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

var myDate = new Date(date);

document.write(myDate);
于 2018-07-09T04:32:13.043 回答