显示 V2EX 准确时间用户脚本( Mac OS X + Chrome + Tampermonkey 测试成功)

2015-12-30 17:50:49 +08:00
 dofy

今天看到 这个帖子 中提到想要显示 V2EX 的准确时间,觉得是个不错的想法,然后看了下页面源码,发现源码中并没有帖子准确时间的数据。
回复中 @px1981 提到一个虽不精确(没有时间数据无法做到绝对精确)但还算靠谱的方案。
于是写了个用户脚本,在 Mac OS X + Chrome + Tampermonkey 下测试成功。

Gist 地址
https://gist.github.com/dofy/38c8d67405a5597f4e7e

源码

// ==UserScript==
// @name         V2EX 绝对时间
// @namespace    http://phpz.org/
// @version      0.1
// @description  显示 V2EX 中的绝对时间
// @author       Seven Yu
// @match        *.v2ex.com/*
// @grant        none
// ==/UserScript==
/* jshint -W097 */
'use strict';

(function(win, doc, $) {
    // 检测列表
    var classList = [
        '.header .gray',    // 楼主时间
        '.cell .small',     // 列表时间
        '.inner .small',    // 最后一条
        '.dock_area .fade', // 个人主页回复列表
        '.cell .snow'       // 系统提醒
    ];
    // 时间正则
    /*
     * RegExp.exec() 返回结构说明
     * 0: 匹配的时间文本
     * 1: 天数
     * 2: 小时数
     * 3: 分钟数
     */
    var dateReg = /(?:(\d+)\s*天前)|(?:(?:(\d+)\s*小时\s*)?(\d+)\s*分钟前)|(?:几秒前|刚刚)/g;
    // 之行检查和替换
    for(var ind in classList) {
        $(classList[ind]).each(function(index, item) {
            var showDate, itemContent, matchArray;
            item = $(item);
            dateReg.lastIndex = 0;
            itemContent = item.html();
            matchArray = dateReg.exec(itemContent);
            showDate = realDate(matchArray);
            if(showDate) {
                //item.css('background-color', 'red');
                item.html(itemContent.replace(matchArray[0], showDate));
            }
        });
    }
    /**
     * 获取绝对时间
     */
    function realDate(matchArray) {
        if(!matchArray)
            return false;
        var now = new Date(),
            nowHour = now.getHours(),
            dayNum = parseInt(matchArray[1] || 0, 10),
            hourNum = parseInt(matchArray[2] || 0, 10),
            minuteNum = parseInt(matchArray[3] || 0, 10),
            itemNow, resultDate, resultTime;
        now -= dayNum * 24 * 60 * 60 * 1000;
        now -= hourNum * 60 * 60 * 1000;
        now -= minuteNum * 60 * 1000;
        itemNow = new Date(now);
        resultDate = [itemNow.getFullYear(), itemNow.getMonth() + 1, itemNow.getDate()].join('-');
        resultTime = [fixZero(itemNow.getHours()), fixZero(itemNow.getMinutes())].join(':');
        if(dayNum > 0) {
            return resultDate;
        } else {
            if(hourNum >= nowHour) {
                return [resultDate, resultTime].join(' ');
            } else {
                return resultTime;
            }
        }
    }
    /**
     * 数字补零
     */
    function fixZero(num) {
        return num > 9 ? num : '0' + num;
    }
})(window, document, window.jQuery);
3412 次点击
所在节点    程序员
8 条回复
px1981
2015-12-30 18:06:50 +08:00
v5
Orzpls
2015-12-30 18:42:51 +08:00
顶一下,说不定用得上呢。
sparrowMan
2015-12-30 22:01:41 +08:00
冲着动手能力 赞一个
dofy
2015-12-31 01:07:56 +08:00
@sparrowMan 哈哈 谢谢
chywj7
2015-12-31 11:28:51 +08:00
越来越极客了
GPU
2016-01-09 08:32:19 +08:00
请问代码是否可以引用集成进 V2EX plus 扩展?
dofy
2016-01-09 17:26:50 +08:00
@GPU 没问题
dofy
2016-01-09 17:28:01 +08:00
@GPU 顺便说一句, V2EX plus 很棒 👍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/247255

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX