关于时间的处理

计算机处理时间一直都是以时间戳的方式进行的, 并且以 格林尼治时间 1970/1/1 0:0:0 开始计算的:

var date = new Date(0);
date.toString() // Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
date.toGMTString() // Thu, 01 Jan 1970 00:00:00 GMT
date.toUTCString() // Thu, 01 Jan 1970 00:00:00 GMT

时间的格式化在前端是再正常不过的需求了, 所以会有类似的实现:

function formatDate(pattern, date) {
    date = new Date(date);

    function formatNumber(data, format) {
        data = data || 0;
        format = format.length;
        return format === 1 ? data : String(Math.pow(10, format) + data).slice(-format);
    }

    return pattern.replace(/([YMDhsmw])\1*/g, function(format) {
        switch (format.charAt()) {
            case 'Y':
                return formatNumber(date.getFullYear(), format);
            case 'M':
                return formatNumber(date.getMonth() + 1, format);
            case 'D':
                return formatNumber(date.getDate(), format);
            case 'h':
                return formatNumber(date.getHours(), format);
            case 'm':
                return formatNumber(date.getMinutes(), format);
            case 's':
                return formatNumber(date.getSeconds(), format);
            case 'w':
                return date.getDay();
        }
    });
}
  1. 最近在做需求的时候遇到 视频时长的问题, 后台返回的是 以秒为单位的数字, 要处理成 hh:mm:ss 这种格式, 在代码里搜了一下, 找到如下实现:function timeLen(time_len) { function fillZero(value) { return ('0' + value).slice(-2, 3); } return [ fillZero(Math.floor(time_len / 3600)), fillZero(Math.floor(time_len % 3600 / 60)), fillZero(time_len % 60) ].join(':'); }

借助于 formatDate, 也可以这么写:

function timeLenFormat(time_len) {
    return formatDate('hh:mm:ss', new Date(time_len * 1000 + (new Date).setHours(0, 0, 0, 0)));
};
  1. 还有一个需求, 要找 N个月以后, 比如 2015/8/31 的 3 个月以后就是 2015/11/30, 月份 +N 很简单, 但是月底要特殊处理, 你不可能输出 2015/11/31, 遇到月底的情况, 这个问题就变成了计算某个月份有多少天了, 平年闰年大小月什么的, 这么简单的问题怎么能想得这么复杂, 所幸 Date 对象支持设置超出范围的日期, 利用这一点: function getDateNextMonth(month, date) { date = date || new Date; var tmp = date.getDate(); date.setMonth(date.getMonth() + month); return tmp === date.getDate() ? date : new Date(date.setDate(1) - 8.64e7); }; 测试: http://yorts52.github.io/html/next-month.html
  2. 时区问题 用 (new Date).getTimezoneOffset() 修正 参考: http://yorts52.github.io/html/date.html, 顺便说一下, 这个页面当初是给测试用的
  3. 另外, 关于时间的处理, 有一个的库: https://github.com/moment/moment

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏不会写文章的程序员不是好厨师

Spring源码初探-IOC(2)-Bean的初始化-自定义标签解析

前面一文介绍的是Spring对于DefaultElement的解析,例如bean/import/alias等,但是在Spring体系中也存在很多扩展标签,例如事...

573
来自专栏SeanCheney的专栏

《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式6.1 读写文本格式的数据6.2 二进制数据格式6.3 Web APIs交互6.4 数据库交互6.5 总结

访问数据是使用本书所介绍的这些工具的第一步。我会着重介绍pandas的数据输入与输出,虽然别的库中也有不少以此为目的的工具。 输入输出通常可以划分为几个大类:读...

4216
来自专栏FreeBuf

浅析ReDoS的原理与实践

*本文原创作者:MyKings,本文属FreeBuf原创奖励计划,未经许可禁止转载 ReDoS(Regular expression Denial of Ser...

3165
来自专栏从零开始的linux

二分查找(python)

假期无聊,在家无网络,就看了看传说中的算法,一个字难 下面都是本人的愚见,如有不对请谅解: 二分查找的前提是有序其次是排除一半,比如1..100之间猜一个数值...

2839
来自专栏King_3的技术专栏

leetcode-728-Self Dividing Numbers

2456
来自专栏深度学习计算机视觉

蓝桥杯试题算法学习笔记一题目

题目 1、熊怪吃核桃 森林里有一只熊怪,很爱吃核桃。不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份。如果不能等分,熊怪就会扔掉一个核桃再分。...

3486
来自专栏Spring相关

js前端日期格式化处理

772
来自专栏祝威廉

如何做Spark 版本兼容

同理对应的Vectors object 也是。这就造成了一个比较大的困难,比如下面的代码就很难做到兼容了,切换Spark就无法通过编译:

522
来自专栏刘望舒

LeakCanary看这一篇文章就够了

LeakCanary是Square公司基于MAT开源的一个内存泄漏检测工具,在发生内存泄漏的时候LeakCanary会自动显示泄漏信息。

1145
来自专栏Jack-Cui

第三天、计算某日是该年的第几天

       编写一个计算天数的程序,用户从键盘中输入年、月、日,在屏幕中输出此日期是该年的第几天。 C代码: /*第三天、计算某日是该年的第几天*/ #i...

1780

扫码关注云+社区