美文网首页
写一个时间处理的库

写一个时间处理的库

作者: bigtom | 来源:发表于2016-08-09 20:59 被阅读11次

本文基于我对 ms 这个库的阅读。这个库的代码一共一百多行,完整看下来也就十几分钟,但是这个库非常的有用。这个库的核心是,将毫秒和可读的表示时间的字符串相互转换。这个库还是存在一些缺陷,比如在毫秒转字符串时用了近似(其实也不算是缺陷,而是有意为之)。

首先定义几个常量,分别为一秒,一分,一时,一日,一年对应的毫秒数。

var s = 1000,
m = s * 60,
h = m * 60,
d = h * 24,
y = d * 365.25  

然后我们写字符串转毫秒的方法

function parse(str){
  var arr = str.split(' '),
  res = 0
  arr.forEach(function(a){
    var match = /^((?:\d+)?\.?\d+) *(y|d|h|m|s|ms)?$/i.exec(a)
    var n = parseFloat(match[1]);

    var type = match[2].toLowerCase();
    switch(type){
      case 'y':
        res += n*y;
        break;
      case 'd':
        res += n*d;
        break;
      case 'h':
        res += n*h;
        break;
      case 'm':
        res += n*m;
        break;
      case 's':
        res += n*s;
        break;
      case 'ms':
        res += n;
    }
  })
  return res
}

测试一下

parse('2d 10h 5s')    //208805000

然后我们写毫秒转字符串的方法

function tostr(ms){
  if(ms === 0) return "";
  if(ms >= d) return Math.round(ms / d)+'d ' + tostr(ms%d);
  if(ms >= h) return Math.round(ms / h)+'h ' + tostr(ms%h);
  if(ms >= m) return Math.round(ms / m)+'m ' + tostr(ms%m);
  if(ms >= s) return Math.round(ms / s)+'s ' + tostr(ms%s);
  return ms + 'ms';
}

console.log(tostr(610000000))

封装

这么多全局变量实在太糟糕,用IIFE封装一下

var ms = (function(){
  var s = 1000,
  m = s*60,
  h = m*60,
  d = h*24,
  y = d*365.25
  function parse(str){
    var arr = str.split(' '),
    res = 0
    arr.forEach(function(a){
      var match = /^((?:\d+)?\.?\d+) *(y|d|h|m|s|ms)?$/i.exec(a)
      var n = parseFloat(match[1]);

      var type = match[2].toLowerCase();
      switch(type){
        case 'y':
          res += n*y;
          break;
        case 'd':
          res += n*d;
          break;
        case 'h':
          res += n*h;
          break;
        case 'm':
          res += n*m;
          break;
        case 's':
          res += n*s;
          break;
        case 'ms':
          res += n;
      }
    })
    return res
  }

  function tostr(ms){
    if(ms === 0) return "";
    if(ms >= d) return Math.round(ms / d)+'d ' + tostr(ms%d);
    if(ms >= h) return Math.round(ms / h)+'h ' + tostr(ms%h);
    if(ms >= m) return Math.round(ms / m)+'m ' + tostr(ms%m);
    if(ms >= s) return Math.round(ms / s)+'s ' + tostr(ms%s);
    return ms + 'ms';
  }

  return function(val, options){
    options = options || {};
    if ('string' == typeof val) return parse(val);
    return tostr(val);
  };
})()

相关文章

  • 写一个时间处理的库

    本文基于我对 ms 这个库的阅读。这个库的代码一共一百多行,完整看下来也就十几分钟,但是这个库非常的有用。这个库的...

  • InfluxDB

    参考文档 InfluxDB 1.7文档 InfluxDB简介 InfluxDB 是一个时间序列数据库,旨在处理高写...

  • jmeter性能压测可视化部署(windows)

    1.安装环境:windows 2.所装软件如下: influxdb1.4.2:是一个时间序列数据库,用于处理海量写...

  • datetime日期模块

    内置的datetime库是一个时间处理模块。主要用来获取当前日期和时间。 datetime.date:日期模块 d...

  • InfluxDB 简介

    InfluxDB 是一个时间序列数据库(TSDB), 被设计用来处理高写入、高查询负载,是 TICK 的一部分。 ...

  • HP滤波法在R中的实现

    这几天写论文要处理一个时间序列数据,想用HP滤波法处理一下季节性因素,奈何mac下不太支持盗版的eviews,所以...

  • iOS 制作本地库Development Pods

    前言:制作一个有相互依赖关系的本地库,之前写的私有库和公开pod库的制作步骤都没有写如果有依赖关系应该如何处理。 ...

  • 善用window.onerror充当全局try-catch处理异

    3分实现功能7分异常。我们每天都在用标准库、用别人的库也自己写库给别人用,异常处理做的好就是好库。javascri...

  • Mac上常用的软件

    Acrobat 处理PDF的软件 Navicat 写数据库 omniGraffle 流程图 calibre 转换电...

  • Java日期查询:日、周、旬、月、季度、年等时间操作

    在进行频次、周期业务处理的时候,需要查询日、周、旬、月、季度、年等周期时间,为此而写的一个时间工具类。

网友评论

      本文标题:写一个时间处理的库

      本文链接:https://www.haomeiwen.com/subject/bzpdsttx.html