Javascript 正确格式化/解析不同的日期格式
我从不同的Javascript 正确格式化/解析不同的日期格式,javascript,date,Javascript,Date,我从不同的API UTC格式:2014-01-01T00:00:00.000Z(String) GMT格式:2018年11月29日星期四17:30:56 GMT(String) unixTimeStamp:1558606726(number) 另外,UTC格式有时可能最终没有Z,因此正常解析将给出时间差 function formatDate(dateString) { var dateTime, utcFormatRegex, zeroHourOffsetRegex; // Some A
API
UTC
格式:2014-01-01T00:00:00.000Z
(String
)GMT
格式:2018年11月29日星期四17:30:56 GMT
(String
)unixTimeStamp
:1558606726
(number
)UTC
格式有时可能最终没有Z
,因此正常解析将给出时间差
function formatDate(dateString) {
var dateTime, utcFormatRegex, zeroHourOffsetRegex;
// Some APIs return a Date in standard ISO UTC format may not have Z at the end
utcFormatRegex = /^\d{4}-\d{2}-\d{2}T.*$/;
zeroHourOffsetRegex = /^.*Z$/;
if (utcFormatRegex.test(dateString) && !zeroHourOffsetRegex.test(dateString)) {
dateString+='Z';
}
dateTime = new Date(dateString);
}
考虑到所有不同格式都有解析函数,我需要一个函数,根据regex
和parse
相应地确定应该使用哪个解析函数。如果正则表达式不是理想的解决方案,那么我该如何处理
我想说的是,应该有一个比“如果没有Z,那么添加一个”更健壮的解决方案,让它通过单个日期时间解析器进行解析。如果我们得到另一个日期-时间格式,它的结尾不能很好地使用Z怎么办?我们将在该时间点进行多次更改。使用正则表达式是可以的,但您需要严格测试所需的格式。如果你得到了意想不到的东西,就抛出一个错误。当前内置解析器的缺点之一是无法指定严格的解析,例如,在提供格式的情况下,如果输入字符串不匹配,解析器就会抛出错误 有一些图书馆可以提供帮助,搜索一下就会发现很多 但是,如果您只需要支持OP中的3种格式,则以下内容可能适合:
/*返回输入可能为以下内容的日期:
**字符串:应视为UTC的ISO 8601时间戳
**是否有尾随的Z
**字符串:格式为的时间戳(使用矩.js标记):
**ddd,DD-MMM-YYYY HH:mm:ss格林威治标准时间
**nunber:UNIX时间值,自1970-01-01 UTC起的秒数
*/
函数toDate(值){
//解析字符串&如果失败,则尽早失败
设d=新日期(值);
//如果无法分析值,则抛出错误
if(isNaN(d.getTime()){
抛出“无效时间戳:”+值;
}
//否则,请完成工作
let days='星期一星期二星期三星期四星期五星期六'。拆分('');
月份='1-2-3-4-5-6-7-8-9-10-11-12'。拆分('');
//首先测试时间值,因为这是最简单的
if(typeof value=='number'&&&!isNaN(value)){
返回新日期(值*1000);
//下一步测试ISO 8601
}如果(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d\d\dZ?$/.test(值)){
返回新日期(/Z$/.test(value)?value:value+'Z');
//随机格式测试
}如果(/^[a-z]{3},\d?\d[a-z]{3}\d{4}\d\d:\d\d:\d\d GMT$/i.test(值)){
设b=value.split(/|:/);
if(天包括(b[0].子项(0,3))&月包括(b[2])){
设x=新日期(Date.UTC)(
b[3],//年
months.indexOf(b[2]),//月,零索引
b[1],//天
b[4],b[5],b[6]//hh:mm:ss
));
//检查值为有效日期,只需检查部分零件
如果(x.getUTCFullYear()==b[3]&&
x、 getUTCDate()==b[1]&&
x、 getUTCHours()==b[4]&&
x、 getUTCSeconds()==b[6]){
返回x;
}否则{
抛出“无效时间戳:”+值;
}
}
//抛出错误,因为格式必须未知
}否则{
抛出“未知格式:”+值;
}
}
//最小测试
var isoString0='2014-01-01T00:00:00.000Z',
isoString1='2014-01-01T00:00:00.000',//没有Z,仍然解析为UTC
randomString='2018年11月29日星期四17:30:56 GMT',
unixTimeValue=1558606726,//假设秒数
invalidDate0='2018-02-29T00:00:00.000Z',//2018年2月29日,内置解析失败
invalidDate1=‘2018年2月29日星期四17:30:56 GMT’,//2018年2月29日否,手动解析失败
无效格式='2019年6月6日';//未知格式
[isoString0,isoString1,randomString,unixTimeValue,invalidDate0,
invalidDate1,invalidFormat].forEach(s=>{
var结果;
试一试{
结果=toDate(s);
console.log(s+'=>\n'+result.toISOString());
}捕获(e){
控制台日志(e);
}
});为什么需要正则表达式?我确实试过了,请不要这样假设。我在没有代码的情况下问了这个问题,以获得如何处理这个问题的一般建议。我的函数看起来有点像这样,@Liam^^上面的代码笔供您参考。请不要假设您需要将您尝试过的内容放入问题中,否则,是的,人们会做出假设。使用正则表达式验证格式很好,但您需要严格测试,而不是现在的松散测试。您所称的“UTC格式”是ISO 8601格式之一。如果缺少Z,则应将其视为本地格式(尽管并非所有内置解析器都会这样做)。末尾没有Z的timezome格式是可接受的格式吗?根据ISO标准,Z必须告知其为UTC。如果没有Z,它会给出GMT?