小型函数系列的第五篇文章是上一篇文章的后续文章,它为您展示了一个用于创建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月份号的范围是0
到11
,其中我们的输入是"01"
到"12"
。
接下来,我们解析时区指示符,对于UTC日期戳可以为"Z"
,也可以为"+10:00"
或"-0600"
类的偏移量。 偏移量将转换为以秒为单位的整数,然后根据偏移量的方式再次转换为正或负毫秒。
最后,我们将组件整数传递给Date.UTC()
,然后将时区偏移量添加到返回的值。 UTC()
方法假定其输入分量已经是UTC格式,因此我们必须添加时区偏移量以补偿该值。 apply()
用于调用UTC()
方法,因为它允许将components
数组作为单个参数传递。
结论
timestamp()
和datestamp()
函数都是JavaScripter工具包的宝贵补充,它们提供了创建和解析普遍存在的ISO格式的能力。 这些功能被证明是有用的,尤其是在那些我们希望忘记的老式旧式浏览器中!