jhzh
2025-04-03 db12897dc68c68d40c557aa59ad78022e2b30ac2
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**
 * 日期时间处理的工具库
 *
 * @author lautin
 * @created 2019-11-19 11:36:02
 */
function getTimeZoneOffset(time) {
    const date = new Date(time);
    // 获取时区偏移值,返回分钟数
    let offset = date.getTimezoneOffset();
    return time +  offset * 60 * 1000;
}
 
/**
 * 将时间戳转化成时间对象的方法
 * @param {mixed} time 传入一个时间戳或者时间对象
 */
function time2Date(time, isOffset = false) {
 
    let date;
 
    if (time.constructor == Date) { // 传入一个时间对象
        date = time;
 
    } else { // 传入一个时间戳
        // 检测时间戳的长度,确保为ms
        if (time.toString().length <= 10) {
            time = Number(time) * 1000;
        }
        // 是否对时差进行转化
        if (isOffset) {
            time = getTimeZoneOffset(time);
        }
 
        // 转化成日期时间对象
        date = new Date(time);
    }
    return date;
}
 
 
/**
 * 将指定日期格式化输出,
 * @param string|object time 输入日期,为一个Date.now()或者Date.UTC返回的时间戳
 * @param string format 输出的格式
 * @param boolean isOffset 是否考虑时区
 */
function parseTime(time, isOffset = false, cformat = null) {
 
    // 设置默认格式
    let format = cformat || '{y}-{m}-{d} {h}:{i}:{s}';
 
    const date = time2Date(time, isOffset);
 
    // 将日期时间值存入对象中
    const dataObj = {
        y: date.getFullYear(),
        m: date.getMonth() + 1, // 显示月份值需要+1
        d: date.getDate(),
        h: date.getHours(),
        i: date.getMinutes(),
        s: date.getSeconds(),
        a: date.getDay()
    };
 
    // 星期值需要转化为中文
    dataObj.a = '星期' + ['日', '一', '二', '三', '四', '五', '六'][dataObj.a];
 
    // 匹配{}中的y|m|d...部分,分别替换不同的值
    const result = format.replace(/{(y|m|d|h|i|s|a)+}/g, (segment, key) => {
        // 由索引提取值
        let value = dataObj[key];
        // 给值添加前导0
        if (segment.length > 0 && value < 10) value = '0' + value;
        return value || 0;
    });
    return result;
}
 
 
/**
 * 发布日期的特定显示方式,
 * @param {string|number} time 显示日期的时间戳
 * @param {string} option 可选参数显示日期
 */
function pubTime(time, isOffset = false, format = null) {
 
    const date = time2Date(time, isOffset);
 
    const current = isOffset ? getTimeZoneOffset(Date.now()) : Date.now();
 
    // 计算时间的差值,返回s为单位的值
    let diff = (current - date.valueOf()) / 1000;
 
    // 2天以内显示距今时间
    if (diff < 30) { // 30s-
        return '刚刚';
 
    } else if (diff < 3600) { // 1h-
        return Math.ceil(diff / 60) + '分钟前';
 
    } else if (diff < 3600 * 24) { // 1d-
        return Math.ceil(diff / 3600) + '小时前';
 
    } else if (diff < 3600 * 24 * 2) { // 2d-
        return '1天前';
 
    } else { // 超过2天显示发布日期
        if (!format) format = '{y}年{m}月{d}日 {h}:{i}';
        return parseTime(time, isOffset, format);
    }
}
 
// 将方法写入构造函数 便于全局使用
Object.assign(Date, {
    time2Date,
    parseTime,
    pubTime,
});
 
export default{
    time2Date,
    parseTime,
    pubTime
}