javascript - 将带有完整月份名称和时间的日期转换为 ISO 日期
问题描述
我有格式的日期和时间戳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);
解决方案
您需要首先解析字符串以获取其组件。然后,您可以生成 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');
推荐阅读
- python - Mystic - 如何正确停止优化
- javascript - movie.map 不是函数
- python-3.x - 如何使用硒选择并单击下拉菜单项
- c# - 有没有办法让 Windows 窗体应用程序中的所有窗口保持焦点?
- python - 尽管 id 存在,但 Python 中的 Beautiful Soup 找不到 id
- linq - 实体框架控制器返回太多数据
- visual-studio - 在带有 Visual Studio 2019 的 Razor Pages 中,编辑标签属性将打乱所有标签助手属性值
- python - 如何从 Visual Studio 中的给定 .pyd 输出构造 python 代码?
- javascript - 使用 discord.js 将机器人消息保存在变量中
- excel - 如何显示在 Excel VBA 中初始化的 3D 数组