您需要首先解析字符串以获取其组件。然后,您可以生成 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');