Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正确格式化/解析不同的日期格式_Javascript_Date - Fatal编程技术网

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);
    }
    
    });