解析ISO时间戳

小型函数系列的第五篇文章是上一篇文章的后续文章,它为您展示了一个用于创建ISO datetamp的简单函数。 上一篇文章指出,某些较旧的浏览器不支持此格式作为Date构造函数的输入。 本文将向您展示一个倒数函数,该函数解析ISO日期戳以生成Unix时间戳,甚至IE6也可以理解!

timestamp()的代码如下所示。

function timestamp(datestamp)
{
  var pattern = /^([\d]{4})\-([\d]{2})\-([\d]{2})T([\d]{2}):([\d]{2}):([\d]{2})(Z|(?:[+\-][\d]{2}[:]?[\d]{2}))$/;
  if(!pattern.test(datestamp)) 
  { 
    return null; 
  }
  
  var 
  components = [], 
  zoneoffset = 0;
  datestamp.replace(pattern, function(a,y,m,d,h,i,s,z)
  {
    for(var bits = [y,m,d,h,i,s], i = 0; i < 6; i ++)
    {
      components[i] = parseInt(bits[i], 10);
    }
    components[1]--;
    
    if(z !== 'Z')
    {
      zoneoffset = 
      (
        (
          (parseInt((z = z.replace(':', '')).substr(1,2), 10) * 3600) 
          + 
          (parseInt(z.substr(3,4), 10) * 60)
        ) 
        * 
        (z.charAt(0) == '-' ? 1000 : -1000)
      );
    }
  });
  
  return Date.UTC.apply(Date, components) + zoneoffset;
}

函数的作用

timestamp()函数采用ISO 8601日期 timestamp() ,例如"2012-12-06T04:19:27+00:00" ,并将其转换为Unix时间戳–自UTC纪元以来的毫秒数,在此示例中将是1354767567000 。 时间戳整数与Date.getTime()方法产生的整数完全相同,在大多数现代浏览器中,我们可以像这样从一个到另一个获取:

new Date("2012-12-06T04:19:27+00:00").getTime();

但是,某些较旧的浏览器不支持该功能-最重要的是IE8或更早版本,但Safari 3也不支持timestamp()函数通过提供在较旧的浏览器中可用的中间转换来填补这一空白。 每当需要将ISO datetamp解析为Date ,只需将其首先通过timestamp()函数传递,如下所示。

new Date(timestamp("2012-12-06T04:19:27+00:00"));

功能如何运作

timestamp()函数利用静态Date.UTC()方法,该方法将一组数字日期分量作为其输入,如下所示:

Date.UTC(2012, 11, 6, 4, 19, 27);

本质上,我们要做的就是将Date.UTC()拆分为这些组件,然后将它们全部传递给Date.UTC() ,我们将获得一个Unix时间戳。 但是,它并不那么简单!

首先,使用简单的正则表达式验证datestamp。 它本来可以更精确,但是更简单的表达式解析起来更便宜,并且我们通常可以假设输入格式要么是完全正确的,要么根本不是ISO日期戳。 但是,如果您确实传递了带有严重不正确值的日期戳,则浏览器仍然会认真地处理它们。 例如,如果您将日期指定为"2012-26-00"则它将被视为2014年1月31日-为"26"月份加上一年零两个月,然后为日期"00"减去一天"00"

如果datestamp验证失败,则timestamp()函数返回null 。 否则,它将继续将日期戳拆分为其组成部分的整数。 这是通过使用带有回调的字符串替换来完成的,这是解析字符串的强大方法。 回调函数将传递一组与regex匹配相对应的参数-一个用于整体匹配,然后一个用于每个反向引用。 在回调中,我们将这些值解析为整数,然后将它们保存到数组中。 对于月份值,我们还必须将值减小一,因为JavaScript月份号的范围是011 ,其中我们的输入是"01""12"

接下来,我们解析时区指示符,对于UTC日期戳可以为"Z" ,也可以为"+10:00""-0600"类的偏移量。 偏移量将转换为以秒为单位的整数,然后根据偏移量的方式再次转换为正或负毫秒。

最后,我们将组件整数传递给Date.UTC() ,然后将时区偏移量添加到返回的值。 UTC()方法假定其输入分量已经是UTC格式,因此我们必须添加时区偏移量以补偿该值。 apply()用于调用UTC()方法,因为它允许将components数组作为单个参数传递。

结论

timestamp()datestamp()函数都是JavaScripter工具包的宝贵补充,它们提供了创建和解析普遍存在的ISO格式的能力。 这些功能被证明是有用的,尤其是在那些我们希望忘记的老式旧式浏览器中!

From: https://www.sitepoint.com/parsing-an-iso-datestamp/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值