I am Oliver

JavaScript 中 Timestamp 与 Date 的转化

问题产生

今天在处理一个接口时,发现返回的格式是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
    "meta": {
        "has_next_msg": false
    },
    "objects": [
        {
            "text": "111",
            "from_user_type": "PAT",
            "pic": "",
            "ts": 1419939065
        }
    ]
}

ts 那个属性我不太熟悉,不过我觉得应该是 timestamp 的意思吧。后来才知道,ts 就是该条消息的发送时间戳(timestamp),显示这条信息的时候应该显示为日期。

把 Date 转化为 Timestamp

我们都知道,在 js 里面把 date 转化为 timestamp 的方法比较简单,而且方法也有好多种,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// get the timestamp in seconds
Math.floor(Date.now() / 1000);

// or with a slightly way
Date.now() / 1000 | 0

// Year 2038 problem? lol...
new Date('Jan 1, 2039') / 1000 | 0 // -2117514496 

/*----------*/
Math.round(new Date().getTime()/1000);

+new Date / 1000 | 0

~~(Date.now() / 1000)

new Date / 1e3 | 0

把 Timestamp 转化为 Date

还有一种需求,比如我要把 timestamp 转化为 1991-10-03 06:01:54 ,那么就需要先把这个 timestamp 转化为日期, 然后再进行format吧,正好我找到一个比较方便的办法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Date.prototype.format = function(format) {
    var o = {
        'M+': this.getMonth() + 1,          // month
        'd+': this.getDate(),                 // day
        'h+': this.getHours(),                  // hour
        'm+': this.getMinutes(),                  // minute
        's+': this.getSeconds(),                    // second     
        'q+': Math.floor((this.getMonth() + 3) / 3),  // quarter
        'S' : this.getMilliseconds()                 // millisecond
    };

    // year
    if (/(y+)/.test(format) || /(Y+)/.test(format)) {
        format = format.replace(RegExp.$1, (this.getFullYear() + '')
                       .substr(4 - RegExp.$1.length));
    }

    for (var k in o) {
        if (new RegExp('(' + k + ')').test(format)) {
            var first = RegExp.$1;
            var str = first.length === 1
                    ? o[k]
                    : ('00' + o[k]).substr(('' + o[k]).length); // nb
            format = format.replace(first, str);
        }
    }

    return format;
};

function tsToDate(timestamp) {
    return (new Date(timestamp * 1000)).format('yyyy-MM-dd hh:mm:ss');
}


// test it
> tsToDate(1448967948)
< "2015-12-01 19:05:48"

打赏