微件:TimeDiff:修订间差异

添加1,683字节 、​ 2022年10月4日 (星期二)
添加了年份、月份计算,支持 UTC 时间戳 // 维基盐编辑器
(重构 salt-time-diff)
(添加了年份、月份计算,支持 UTC 时间戳 // 维基盐编辑器)
第15行: 第15行:
   //! 实时更新则额外加上 real-time ——结束时间会强制改为当前时间
   //! 实时更新则额外加上 real-time ——结束时间会强制改为当前时间
   //! 更复杂的显示请额外加上 complex ——可以用CSS修改渲染样式
   //! 更复杂的显示请额外加上 complex ——可以用CSS修改渲染样式
  //! 如果时间是UTC请额外加上 utc
   //! ">{起始时间}SPLIT{结束时间}SPLIT{指令(d-天,h-小时,m-分钟,s-秒,M-毫秒)}</span>
   //! ">{起始时间}SPLIT{结束时间}SPLIT{指令(d-天,h-小时,m-分钟,s-秒,M-毫秒)}</span>
  var UTCOffset = new Date().getTimezoneOffset() * 60 * 1e3;
   var cmdAttr = "data-salt-time-diff-command";
   var cmdAttr = "data-salt-time-diff-command";
   var startAttr = "data-salt-time-diff-start";
   var startAttr = "data-salt-time-diff-start";
   var endAttr = "data-salt-time-diff-end";
   var endAttr = "data-salt-time-diff-end";
   function getDate(time) {
  var i18n = {
    year: "年",
    month: "个月",
    day: "天",
    hour: "小时",
    minute: "分钟",
    second: "秒",
    ms: "毫秒"
  };
   function getDate(time, utc = false) {
     if (!time)
     if (!time)
       return new Date();
       return new Date();
     if (/^\d+$/.test(time.trim())) {
     if (/^\d+$/.test(time.trim())) {
       const d2 = new Date(+time);
       const d2 = new Date(+time);
       if (!isNaN(d2.valueOf()))
       if (!isNaN(d2.valueOf())) {
        if (utc)
          d2.setTime(d2.getTime() + UTCOffset);
         return d2;
         return d2;
       else
       } else
         return new Date();
         return new Date();
     }
     }
第35行: 第48行:
       return new Date();
       return new Date();
   }
   }
   function timeDiff(_ms = 0, cmd = "d", cpx = false) {
   function timeDiff({
    t1,
    t2,
    cmd = "d",
    cpx = false
  }) {
    const _ms = t1.valueOf() - t2.valueOf();
    const isBefore = t1.valueOf() - t2.valueOf() > 0;
    const d1 = new Date(isBefore ? t2 : t1);
    const d2 = new Date(isBefore ? t1 : t2);
     let ms = Math.abs(_ms);
     let ms = Math.abs(_ms);
     const isBefore = _ms > 0;
     const diff = { isBefore };
     let res = cpx ? isBefore ? '<span class="salt-time-diff-txt salt-time-diff-before">还有</span>' : '<span class="salt-time-diff-txt salt-time-diff-after">已过去</span>' : "";
     if (cmd.indexOf("y") != -1) {
      let years = d2.getFullYear() - d1.getFullYear();
      d1.setFullYear(d2.getFullYear());
      if (d1.getTime() > d2.getTime()) {
        years -= 1;
        d1.setFullYear(d1.getFullYear() - 1);
      }
      ms = d2.getTime() - d1.getTime();
      diff.year = years;
    }
    if (cmd.indexOf("o") != -1) {
      let years = d2.getFullYear() - d1.getFullYear();
      d1.setFullYear(d2.getFullYear());
      if (d1.getTime() > d2.getTime()) {
        years -= 1;
        d1.setFullYear(d1.getFullYear() - 1);
      }
      let months = d2.getMonth() - d1.getMonth();
      if (d2.getFullYear() - d1.getFullYear())
        months += 12;
      d1.setFullYear(d2.getFullYear());
      d1.setMonth(d2.getMonth());
      if (d1.getTime() > d2.getTime()) {
        months -= 1;
        d1.setMonth(d1.getMonth() - 1);
      }
      ms = d2.getTime() - d1.getTime();
      diff.month = years * 12 + months;
    }
     if (cmd.indexOf("d") != -1) {
     if (cmd.indexOf("d") != -1) {
       let days = Math.floor(ms / (24 * 3600 * 1e3));
       let days = Math.floor(ms / (24 * 3600 * 1e3));
       ms = ms % (24 * 3600 * 1e3);
       ms = ms % (24 * 3600 * 1e3);
       res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-day">${days}</span>天` : `${days}天`;
       diff.day = days;
     }
     }
     if (cmd.indexOf("h") != -1) {
     if (cmd.indexOf("h") != -1) {
       let hours = Math.floor(ms / (3600 * 1e3));
       let hours = Math.floor(ms / (3600 * 1e3));
       ms = ms % (3600 * 1e3);
       ms = ms % (3600 * 1e3);
       res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-hour">${hours}</span>小时` : `${hours}小时`;
       diff.hour = hours;
     }
     }
     if (cmd.indexOf("m") != -1) {
     if (cmd.indexOf("m") != -1) {
       let minutes = Math.floor(ms / (60 * 1e3));
       let minutes = Math.floor(ms / (60 * 1e3));
       ms = ms % (60 * 1e3);
       ms = ms % (60 * 1e3);
       res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-minute">${minutes}</span>分钟` : `${minutes}分钟`;
       diff.minute = minutes;
     }
     }
     if (cmd.indexOf("s") != -1) {
     if (cmd.indexOf("s") != -1) {
       let seconds = Math.floor(ms / 1e3);
       let seconds = Math.floor(ms / 1e3);
       ms = ms % 1e3;
       ms = ms % 1e3;
       res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-second">${seconds}</span>秒` : `${seconds}秒`;
       diff.second = seconds;
    }
    if (cmd.indexOf("M") != -1 || ms === Math.abs(_ms)) {
      diff.ms = ms;
     }
     }
     if (cmd.indexOf("M") != -1 || res.length < 1) {
     return readableTimeTxt(diff, cpx);
       res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-ms">${ms}</span>毫秒` : `${ms}毫秒`;
  }
  function readableTimeTxt(timeObj, cpx = false) {
    let res = cpx ? timeObj.isBefore ? '<span class="salt-time-diff-txt salt-time-diff-before">还有</span>' : '<span class="salt-time-diff-txt salt-time-diff-after">已过去</span>' : "";
    const loop = [
      "year",
      "month",
      "day",
      "hour",
      "minute",
      "second",
      "ms"
    ];
    for (let i = 0; i < loop.length; i++) {
       const t = loop[i];
      if (t in timeObj) {
        res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-${t}">${timeObj[t]}</span><span class="salt-time-diff-txt salt-time-diff-txt-${t}">${i18n[t]}</span>` : `${timeObj[t]}${i18n[t]}`;
      }
     }
     }
     return res;
     return res;
第68行: 第137行:
     for (let i = 0; i < elems.length; i++) {
     for (let i = 0; i < elems.length; i++) {
       let el = elems[i];
       let el = elems[i];
       let txt = (el.textContent || "").replace(/[年月日]/g, "/").replace(/[;:]/g, ":").split("SPLIT");
      const utc = el.classList.contains("utc");
       let time1 = getDate(txt[0]);
       let txt = (el.textContent || "").split("SPLIT");
      let time2 = getDate(txt[1]);
      const t1 = getDate(txt[0].replace(/[年月日]/g, "/").replace(/[;:]/g, ":"), utc);
       const t2 = getDate(txt[1].replace(/[年月日]/g, "/").replace(/[;:]/g, ":"), utc);
       let cmd = "d";
       let cmd = "d";
       if (txt.length > 2) {
       if (txt.length > 2) {
         cmd = txt[2].replace(/[天日]/, "d").replace(/小?时/, "h").replace(/分钟?/, "m").replace("毫秒", "M").replace("秒", "s");
         cmd = txt[2].replace(/年份?/, "y").replace(/月份?/, "o").replace(/[天日]/, "d").replace(/小?时/, "h").replace(/分钟?/, "m").replace("毫秒", "M").replace("秒", "s");
       }
       }
       const cps = el.classList.contains("complex");
       const cpx = el.classList.contains("complex");
       const t = timeDiff(time1.getTime() - time2.getTime(), cmd, cps);
       const t = timeDiff({ t1, t2, cmd, cpx });
       if (!cps)
       if (!cpx)
         el.textContent = t;
         el.textContent = t;
       else
       else
第84行: 第154行:
       el.classList.add("salt-time-diff-done");
       el.classList.add("salt-time-diff-done");
       el.setAttribute(cmdAttr, cmd);
       el.setAttribute(cmdAttr, cmd);
       el.setAttribute(startAttr, time1.toString());
       el.setAttribute(startAttr, t1.toString());
       el.setAttribute(endAttr, time2.toString());
       el.setAttribute(endAttr, t2.toString());
     }
     }
   }
   }
第99行: 第169行:
         setTimeout(() => {
         setTimeout(() => {
           const el = elems[i];
           const el = elems[i];
           const time1 = getDate(el.getAttribute(startAttr));
           const t1 = getDate(el.getAttribute(startAttr));
           const time2 = getDate();
           const t2 = getDate();
           const cmd = el.getAttribute(cmdAttr) || "d";
           const cmd = el.getAttribute(cmdAttr) || "d";
           const cps = el.classList.contains("complex");
           const cpx = el.classList.contains("complex");
           const t = timeDiff(time1.getTime() - time2.getTime(), cmd, cps);
           const t = timeDiff({ t1, t2, cmd, cpx });
           if (!cps) {
           if (!cpx) {
             if (el.textContent != t)
             if (el.textContent != t)
               el.textContent = t;
               el.textContent = t;
第125行: 第195行:
   });
   });
})();
})();
</script></includeonly><noinclude>请使用模板{{tl|时间差}}。
</script></includeonly><noinclude>请使用模板{{tl|时间差}}。


原微件搬运自[https://wiki.biligame.com/mcplayer/Widget:TimeDiff 我的世界玩家社区Wiki],原作者:Salt_lovely(原作者即搬运者)。</noinclude>
原微件搬运自[https://wiki.biligame.com/mcplayer/Widget:TimeDiff 我的世界玩家社区Wiki],原作者:Salt_lovely(原作者即搬运者)。</noinclude>