将具有完整月份名称和时间的日期转换为 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);
我有格式为 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);