时间-时辰 js

用于发送的微博/Microblog 的时间记录,1 - 2 kb 的小玩意。

根据时间返回对时间的描述,例如:

  • 刚刚
  • 22 小时前
  • 3 天前 23:45 • 子时 夜半 (半夜)
  • 5 天前 01:49 • 丑时 鸡鸣 (凌晨)
  • 2000 年 7 月 31 日 00:24 • 子时 夜半 (半夜)

按照时辰-24小时时间-通俗约定,大概范围是:

子时(23-1点):半夜
丑时(1-3点):凌晨
寅时(3-5点):黎明
卯时(5-7点):清晨
辰时(7-9点):早上
巳时(9-11点):上午
午时(11-13点):中午
未时(13-15点):午后
申时(15-17点):下午
酉时(17-19点):傍晚
戌时(19-21点):晚上
亥时(21-23点):深夜

 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
// 十二时辰对应
const tzArr = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
const sdArr = ['夜半', '鸡鸣', '平旦', '日出', '食时', '隅中', '日中', '日昳', '晡时', '日入', '黄昏', '人定'];
const sdArr2 = ['半夜', '凌晨', '黎明', '清晨', '早上', '上午', '中午', '午后', '下午', '傍晚', '晚上', '深夜'];


function formatTime(timestamp) {
    const now = new Date();
    const inputTime = new Date(timestamp);
    // console.log(inputTime)
    
    const timeDiff = now - inputTime;

    const seconds = Math.floor(timeDiff / 1000);
    const minutes = Math.floor(seconds / 60);
    const hours = Math.floor(minutes / 60);
    const days = Math.floor(hours / 24);

    if (seconds < 60) {
        return "刚刚";
    } else if (minutes < 60) {
        return `${minutes} 分钟前`;
    } else if (hours < 24) {
        return `${hours} 小时前`;
    } else if (days < 7) {
        return `${days} 天前 ${formatHour(inputTime)}`;
    }

    const yearNow = now.getFullYear();
    const yearInput = inputTime.getFullYear();

    if (yearNow === yearInput) {
        return `${inputTime.getMonth() + 1}${inputTime.getDate()}${formatHour(inputTime)}`;
    } else {
        return `${yearInput}${inputTime.getMonth() + 1}${inputTime.getDate()}${formatHour(inputTime)}`;
    }
}

function formatHour(date) {
    const hour = date.getHours();
    const minute = date.getMinutes();

    // 添加判断时辰的逻辑
    const tzIndex = Math.floor((hour + 1) / 2) % 12;
    const timeString = `${formatNumber(hour)}:${formatNumber(minute)}`;

    return `${timeString}${tzArr[tzIndex]}${sdArr[tzIndex]}  (${sdArr2[tzIndex]})`;
}

function formatNumber(number) {
    return number < 10 ? `0${number}` : number;
}

min js

1
const tzArr=["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"],sdArr=["夜半","鸡鸣","平旦","日出","食时","隅中","日中","日昳","晡时","日入","黄昏","人定"],sdArr2=["半夜","凌晨","黎明","清晨","早上","上午","中午","午后","下午","傍晚","晚上","深夜"];function formatTime(r){const t=new Date,o=new Date(r),e=t-o,n=Math.floor(e/1e3),u=Math.floor(n/60),f=Math.floor(u/60),a=Math.floor(f/24);if(n<60)return"刚刚";if(u<60)return`${u} 分钟前`;if(f<24)return`${f} 小时前`;if(a<7)return`${a} 天前 ${formatHour(o)}`;const $=t.getFullYear(),m=o.getFullYear();return $===m?`${o.getMonth()+1}${o.getDate()}${formatHour(o)}`:`${m}${o.getMonth()+1}${o.getDate()}${formatHour(o)}`}function formatHour(r){const t=r.getHours(),o=r.getMinutes(),e=Math.floor((t+1)/2)%12;return`${`${formatNumber(t)}:${formatNumber(o)}`}${tzArr[e]}${sdArr[e]}  (${sdArr2[e]})`}function formatNumber(r){return r<10?`0${r}`:r}

测试

 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
// 测试函数
function testFormatTime() {
    const testTimestamps = [
        Date.now() - 30 * 1000, // 30秒前
        Date.now() - 180 * 1000, // 3分钟前
        Date.now() - 2 * 3600 * 1000, // 2小时前
        Date.now() - 5 * 24 * 3600 * 1000, // 5天前
        Date.now() - 10 * 24 * 3600 * 1000, // 10天前
        new Date("2023-08-15T08:00:00").getTime(), // 8月15日上午8:00
        new Date("2023-03-20T18:30:00").getTime(), // 3月20日下午6:30
        new Date("2023-08-19T22:45:00").getTime(), // 当前日期晚上10:45
        new Date("2023-01-01T23:00:00").getTime(),
        new Date("2023-01-01T00:59:00").getTime(),
        new Date("2023-01-01T01:00:00").getTime(),
        new Date("2023-01-01T01:59:00").getTime(),
        new Date("2023-01-01T00:00:00").getTime(),
        new Date("2023-01-01T01:00:00").getTime(),
        new Date("2023-01-01T02:00:00").getTime(),
        new Date("2023-01-01T03:00:00").getTime(),
        new Date("2023-01-01T04:00:00").getTime(),
        new Date("2023-01-01T05:00:00").getTime(),
        new Date("2023-01-01T06:00:00").getTime(),
        new Date("2023-01-01T07:00:00").getTime(),
        new Date("2023-01-01T08:00:00").getTime(),
        new Date("2023-01-01T09:00:00").getTime(),
        new Date("2023-01-01T10:00:00").getTime(),
        new Date("2023-01-01T11:00:00").getTime(),
        new Date("2023-01-01T12:00:00").getTime(),
        new Date("2023-01-01T13:00:00").getTime(),
        new Date("2023-01-01T14:00:00").getTime(),
        new Date("2023-01-01T15:00:00").getTime(),
        new Date("2023-01-01T16:00:00").getTime(),
        new Date("2023-01-01T17:00:00").getTime(),
        new Date("2023-01-01T18:00:00").getTime(),
        new Date("2023-01-01T19:00:00").getTime(),
        new Date("2023-01-01T20:00:00").getTime(),
        new Date("2023-01-01T21:00:00").getTime(),
        new Date("2023-01-01T22:00:00").getTime(),
        new Date("2023-01-01T23:00:00").getTime()
    ];

    for (const timestamp of testTimestamps) {
        console.log(formatTime(timestamp));
    }
}

testFormatTime();