人生最大的错误是不断担心会犯错 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

Javascript中像PHP使用date函数一样的处理日期数据

前端设计 memory 发布于April 11, 2018 标签: JavaScript

属性与方法

内容基本参照了 php 的日期页面,但由于不需要支持语言和时区,把 Z I S e 的用途做了改变。

无前导0的为数值类型,前导0的为字符串类型。

属性描述例子备注
------------
d每月的几号,2位数字,前导001 到 31
j每月的几号,无前导01 到 31
NISO-8601周日历,每周第几天1(周一)到7(周日)
w每周第几天0(周日)到6(周六)
z每年第几天(从0开始)0 到 365
Z每年第几天(从1开始)1 到 366变化
------------
WISO-8601周日历第几周,每周从周一开始,前导001-53
eISO-8601周日历第几周,每周从周一开始,无前导01-53变化
------------
m月份,前导001-12
n月份,无前导01-12
t本月有几天28-31
------------
L是否闰年闰年1,否则0
oISO-8601周日历中的年份,一般和Y相同,年初和年尾的那周可能不同例子:1999、2003
Y年份,4位数字例子:1999、2003
y年份,2位数字例子:99、03
时间------------
a午前午后am pm
A午前午后AM PM
g12小时制,无前导01 到 1212 小时制没有 0 点
G24小时制,无前导00 到 23
h12小时制,前导001 到 1212 小时制没有 0 点
H24小时制,前导000 到 23
i分,前导000 到 59
I分,无前导00 到 59变化
s秒,前导000 到 59
S秒,无前导00 到 59变化
方法描述例子
format将字符串中与属性名匹配的部分替换成数值ld.format('Y-m-d') => '2017-12-05'

用法

var ld = litdate(); // 当前时间
ld.Y // 2017;
ld.format('Y-m-d H:i:s'); // 2017-12-05 22:16:07

var ld20170101 = litdate(new Date(2017, 0, 1, 22, 16, 7)); // 传入 Date 对象
ld20170101.format('y年n月j日 G时I分S秒'); // 17年1月1日 22时16分7秒

代码

(function (global, factory) {
    typeof module !== 'undefined' && typeof module.exports !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(['exports'], factory) :
    global.litdate = factory();
}(this, function () { 'use strict';
    return function (date) {
        if (typeof date == 'undefined') {
            date = new Date();
        }

        var DAY = 86400000;

        var zero = function (n) {
            return n < 10 ? '0' + n : '' + n;
        };

        var weekdateoffset = function (date0101) {
            var N = date0101.getDay();
            var offset = N <= 4 ? N - 1 : N - 8;
            return offset; 
        }

        var j = date.getDate();
        var d = zero(j);
        var w = date.getDay();
        var N = w == 0 ? 7 : w;
        var date0101 = new Date(date.getTime());
        date0101.setMonth(0);
        date0101.setDate(1);
        var z = (date.getTime() - date0101.getTime()) / DAY;
        var Z = z + 1;

        var n = date.getMonth() + 1;
        var m = zero(n);

        var Y = date.getFullYear();
        var y = ('' + Y).substr(2);
        var L = (Y % 4 == 0 && Y % 100 != 0) || Y % 400 == 0 ? 1 : 0
        var t = [31, 28 + L, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][n - 1];

        var tsMonday = date.getTime() - (N - 1) * DAY;
        var tsFirstMonday = date0101.getTime() - weekdateoffset(date0101) * DAY;

        var W = (tsMonday - tsFirstMonday) / DAY / 7 + 1;
        var o = new Date(tsMonday).getFullYear();
        if (W == 0) {
            var prev0101 = new Date(date0101.getTime());
            prev0101.setYear(o);
            var tsPrevFirstMonday = prev0101.getTime() - weekdateoffset(prev0101) * DAY;
            W = (tsMonday - tsPrevFirstMonday) / DAY / 7 + 1;
        } else {
            var next0101 = new Date(Math.round(date0101.getTime() + DAY * (365 + L)));
            var tsNextFirstMonday = next0101.getTime() - weekdateoffset(next0101) * DAY;
            if (tsMonday >= tsNextFirstMonday) {
                W = 1;
                o = Y + 1;
            }
        }
        var e = W;
        W = W < 10 ? '0' + W : '' + W;

        var G = date.getHours();
        var g = G % 12 ? G % 12 : 12;
        var H = zero(G);
        var h = zero(g);
        var a = G > 11 ? 'pm' : 'am';
        var A = G > 11 ? 'PM' : 'AM';
        var I = date.getMinutes();
        var i = zero(I);
        var S = date.getSeconds();
        var s = zero(S);

        var obj = {
            d: d,
            j: j,
            N: N,
            w: w,
            z: z,
            Z: Z,
            W: W,
            e: e,
            m: m,
            n: n,
            t: t,
            L: L,
            o: o,
            Y: Y,
            y: y,
            a: a,
            A: A,
            g: g,
            G: G,
            h: h,
            H: H,
            i: i,
            I: I,
            s: s,
            S: S
        };

        var format = function (str) {
            var chars = str.split('');
            for (var i = 0; i < chars.length; i++) {
                if (typeof obj[chars[i]] != 'undefined') {
                    chars[i] = obj[chars[i]];
                }
            }
            return chars.join('');
        };

        obj.format = format;

        return obj;
    };
}));

示例

var assert = require('assert');
var litdate = require('./litdate.js');

var date1 = new Date(2005, 0, 2, 3, 4, 5);
var date20070101 = new Date(2007, 0, 1);
var date20071231 = new Date(2007, 11, 31);
var date20080201 = new Date(2008, 1, 1, 0, 35);
var date20090201 = new Date(2009, 1, 1, 12, 35);
var date20000101 = new Date(2000, 0, 1, 1, 35);
var date19000101 = new Date(1900, 0, 1, 13, 35);

describe('年月日时分秒', function () {
    it('Y-m-d H:i:s', function () {
        assert.equal('2005-01-02 03:04:05', litdate(date1).format('Y-m-d H:i:s'));
    });
    it('y年n月j日 G时I分S秒', function () {
        assert.equal('05年1月2日 3时4分5秒', litdate(date1).format('y年n月j日 G时I分S秒'));
    });
});
describe('周', function () {
    it('属于上一年', function () {
        assert.equal('2004-53-7', litdate(date1).format('o-W-N'));
    });
    it('属于本年', function () {
        assert.equal('2007-01-1', litdate(date20070101).format('o-W-N'));
    });
    it('属于下一年', function () {
        assert.equal('2008-01-1', litdate(date20071231).format('o-W-N'));
    });
    it('无前导0的周', function () {
        assert.equal(1, litdate(date20071231).e);
    });
    it('周日0', function () {
        assert.equal(0, litdate(date1).w);
    });
});
describe('月', function () {
    it('1月有31天', function () {
        assert.equal(31, litdate(date1).t);
    });
    it('2008年2月有29天', function () {
        assert.equal(29, litdate(date20080201).t);
    });
    it('2009年2月有28天', function () {
        assert.equal(28, litdate(date20090201).t);
    });
});
describe('闰年', function () {
    it('2008年是闰年', function () {
        assert.equal(1, litdate(date20080201).L);
    });
    it('2007年是平年', function () {
        assert.equal(0, litdate(date20070101).L);
    });
    it('2000年是润年', function () {
        assert.equal(1, litdate(date20000101).L);
    });
    it('1900年是平年', function () {
        assert.equal(0, litdate(date19000101).L);
    });
});
describe('每年第几天', function () {
    it('2007年1月1日是第1天', function () {
        assert.equal(0, litdate(date20070101).z);
        assert.equal(1, litdate(date20070101).Z);
    });
    it('2007年12月31日是第365天', function () {
        assert.equal(364, litdate(date20071231).z);
        assert.equal(365, litdate(date20071231).Z);
    });
});
describe('12小时制', function () {
    it('00:35 等于 12:35am', function () {
        assert.equal('12:35am', litdate(date20080201).format('h:ia'));
    });
    it('12:35 等于 12:35pm', function () {
        assert.equal('12:35pm', litdate(date20090201).format('h:ia'));
    });
    it('01:35 等于 01:35am', function () {
        assert.equal('01:35am', litdate(date20000101).format('h:ia'));
        assert.equal('1:35AM', litdate(date20000101).format('g:iA'));
    });
    it('13:35 等于 01:35pm', function () {
        assert.equal('01:35pm', litdate(date19000101).format('h:ia'));
        assert.equal('1:35PM', litdate(date19000101).format('g:iA'));
    });
});

开源地址 https://gitee.com/xiongliding/litdate

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1549篇
  • 用户评论:806条
  • 开博至今:4250天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • 小云: 打卡
  • 小云: 不错啊,收藏起来先
  • 小云: 收藏,很不错
  • memory: 动态添加没有试过,可能需要绑定事件了
  • 111: 动态添加按钮怎么添加,pick:class名是那个能在具体一点吗...
  • 今日头条: 文章不错非常喜欢
  • memory: 你看一下 gmp-6.1.2 的版本咧,不行换低点的.
  • 大叔: 发现编译出来的包,在 centos6 下运行错误。提示这个:ve...
  • : 感谢,我现在才知道还有快捷键这个东东!!!
  • 1: 天书啊
  • memory: 可以去官方网站找找手册了,好久不玩它了.
  • xiaoyan: 怎么解决的啊
  • 银行建设: 生产环境应该怎么搭建redis集群呢?
  • memory: 好久没折腾WIN了?不确认哟。
  • 虫虫: tomcat apache nginx能装吗
  • 咚咚: 开源的放一个吧
  • memory: 好几年不更新了。。。