MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
微件:TimeDiff:修订间差异
跳到导航
跳到搜索
Salt lovely(留言 | 贡献) (模板搬运) |
Salt lovely(留言 | 贡献) (重构 salt-time-diff) |
||
第1行: | 第1行: | ||
<includeonly><script> |
<includeonly><script> |
||
"use strict"; |
|||
// time: 2020-10-29 |
|||
(() => { |
|||
// author: Salt_lovely |
|||
// src/utils/utils.ts |
|||
// func: 计算时间差,格式<!-- <span class="salt-time-diff (实时更新则额外加上real-time——结束时间会强制改为当前时间)">{起始时间}|{结束时间}|{指令(d-天,h-小时,m-分钟,s-秒,M-毫秒)}</span> --> |
|||
function docReady(fn) { |
|||
if (typeof saltTimeDiffMark_noConflictSign == 'undefined') { var saltTimeDiffMark_noConflictSign = false } // 如果一个页面中有多个此脚本,则不启用 |
|||
if (document.readyState === "loading") { |
|||
window.addEventListener('load', () => { |
|||
window.addEventListener("DOMContentLoaded", fn); |
|||
'use strict'; |
|||
} else { |
|||
if (saltTimeDiffMark_noConflictSign) { return } else { saltTimeDiffMark_noConflictSign = true } // 如果一个页面中有多个此脚本,则不启用 |
|||
fn(); |
|||
timediffHandle() // 开始计算 |
|||
timediffRealtime() // 实时更新 |
|||
// 函数部分 |
|||
function timediffHandle() { |
|||
var elems = document.querySelectorAll('.salt-time-diff') |
|||
for (let i = 0; i < elems.length; i++) { |
|||
var el = elems[i] |
|||
// txt: [0]起始时间 [1]结束时间,默认为当前时间 [2] |
|||
var txt = el.textContent.replace(/[年月日]/g, '/').replace(/[;:]/g, ':').split('SPLIT') |
|||
var time1 = new Date(txt[0]), time2, time3, outtxt |
|||
if (!time1.getTime() || time1.getTime() == NaN) { time1 = new Date() } // 预防无效输入 |
|||
if (txt.length < 2) { |
|||
time2 = new Date() |
|||
} else { |
|||
time2 = new Date(txt[1]) |
|||
if (!time2.getTime() || time2.getTime() == NaN) { time2 = new Date() } // 预防无效输入 |
|||
} |
|||
time3 = Math.abs(time1.getTime() - time2.getTime()) |
|||
// 送入timediff函数 |
|||
if (txt.length > 2) { |
|||
txt[2] = txt[2].replace('天', 'd').replace('时', 'h').replace('分', 'm').replace('毫秒', 'M').replace('秒', 's') |
|||
outtxt = timediff(time3, txt[2]) |
|||
el.setAttribute('timeDiff-command', txt[2]) |
|||
} else { |
|||
outtxt = timediff(time3) |
|||
el.setAttribute('timeDiff-command', 'd') |
|||
} |
|||
el.textContent = outtxt |
|||
// 后续处理 |
|||
el.classList.remove('salt-time-diff') |
|||
el.classList.add('salt-time-diff-done') |
|||
el.setAttribute('startTime', time1.toString()) |
|||
el.setAttribute('endTime', time2.toString()) |
|||
} |
|||
} |
} |
||
} |
|||
function timediffRealtime() { |
|||
var elems = document.querySelectorAll('.salt-time-diff-done.real-time') |
|||
// widget/SaltTimeDiff/widget.ts |
|||
setInterval(() => { // 主要过程: 每0.25秒更新一次 |
|||
//! <span class="salt-time-diff |
|||
for (let i = 0; i < elems.length; i++) { |
|||
//! 实时更新则额外加上 real-time ——结束时间会强制改为当前时间 |
|||
setTimeout(() => { // 异步, 避免卡顿 |
|||
//! 更复杂的显示请额外加上 complex ——可以用CSS修改渲染样式 |
|||
var el = elems[i] |
|||
//! ">{起始时间}SPLIT{结束时间}SPLIT{指令(d-天,h-小时,m-分钟,s-秒,M-毫秒)}</span> |
|||
var time1 = new Date(el.getAttribute('startTime')) |
|||
var cmdAttr = "data-salt-time-diff-command"; |
|||
, time2 = new Date() |
|||
var startAttr = "data-salt-time-diff-start"; |
|||
, cmd = el.getAttribute('timeDiff-command') |
|||
var endAttr = "data-salt-time-diff-end"; |
|||
if (!time1.getTime() || time1.getTime() == NaN) { // 预防无效输入 |
|||
function getDate(time) { |
|||
time1 = new Date() |
|||
if (!time) |
|||
el.setAttribute('startTime', time1.toString()) |
|||
return new Date(); |
|||
if (/^\d+$/.test(time.trim())) { |
|||
var time3 = Math.abs(time1.getTime() - time2.getTime()) |
|||
const d2 = new Date(+time); |
|||
// 送入timediff函数 |
|||
if (!isNaN(d2.valueOf())) |
|||
var t = timediff(time3, cmd) |
|||
return d2; |
|||
if (el.textContent != t) { el.textContent = t } // 避免闪烁 |
|||
else |
|||
return new Date(); |
|||
} |
|||
const d = new Date(time); |
|||
setInterval(() => { // 检查是否有漏网之鱼: 每5秒更新一次 |
|||
if (!isNaN(d.valueOf())) |
|||
if (document.querySelectorAll('.salt-time-diff').length > 0) { timediffHandle() } |
|||
return d; |
|||
elems = document.querySelectorAll('.salt-time-diff-done.real-time') |
|||
else |
|||
return new Date(); |
|||
} |
|||
function timeDiff(_ms = 0, cmd = "d", cpx = false) { |
|||
let ms = Math.abs(_ms); |
|||
const isBefore = _ms > 0; |
|||
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("d") != -1) { |
|||
let days = Math.floor(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}天`; |
|||
} |
|||
if (cmd.indexOf("h") != -1) { |
|||
let hours = Math.floor(ms / (3600 * 1e3)); |
|||
ms = ms % (3600 * 1e3); |
|||
res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-hour">${hours}</span>小时` : `${hours}小时`; |
|||
} |
|||
if (cmd.indexOf("m") != -1) { |
|||
let minutes = Math.floor(ms / (60 * 1e3)); |
|||
ms = ms % (60 * 1e3); |
|||
res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-minute">${minutes}</span>分钟` : `${minutes}分钟`; |
|||
} |
|||
if (cmd.indexOf("s") != -1) { |
|||
let seconds = Math.floor(ms / 1e3); |
|||
ms = ms % 1e3; |
|||
res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-second">${seconds}</span>秒` : `${seconds}秒`; |
|||
} |
|||
if (cmd.indexOf("M") != -1 || res.length < 1) { |
|||
res += cpx ? `<span class="salt-time-diff-res salt-time-diff-res-ms">${ms}</span>毫秒` : `${ms}毫秒`; |
|||
} |
} |
||
return res; |
|||
function timediff(ms = 0, cmd = 'd') { // 默认:没有时间差,只输出日期 |
|||
} |
|||
var finaltxt = '' |
|||
function timeDiffHandler() { |
|||
if (cmd.indexOf('d') != -1) { |
|||
let elems = document.querySelectorAll(".salt-time-diff"); |
|||
let days = Math.floor(ms / (24 * 3600 * 1000)) |
|||
for (let i = 0; i < elems.length; i++) { |
|||
ms = ms % (24 * 3600 * 1000) // 除去天数后剩余的毫秒数 |
|||
let el = elems[i]; |
|||
let txt = (el.textContent || "").replace(/[年月日]/g, "/").replace(/[;:]/g, ":").split("SPLIT"); |
|||
} |
|||
let time1 = getDate(txt[0]); |
|||
let time2 = getDate(txt[1]); |
|||
let cmd = "d"; |
|||
ms = ms % (3600 * 1000) // 除去小时后剩余的毫秒数 |
|||
if (txt.length > 2) { |
|||
finaltxt += hours + '小时' |
|||
cmd = txt[2].replace(/[天日]/, "d").replace(/小?时/, "h").replace(/分钟?/, "m").replace("毫秒", "M").replace("秒", "s"); |
|||
} |
|||
} |
|||
if (cmd.indexOf('m') != -1) { |
|||
const cps = el.classList.contains("complex"); |
|||
let hours = Math.floor(ms / (60 * 1000)) |
|||
const t = timeDiff(time1.getTime() - time2.getTime(), cmd, cps); |
|||
ms = ms % (60 * 1000) // 除去分钟后剩余的毫秒数 |
|||
if (!cps) |
|||
finaltxt += hours + '分钟' |
|||
el.textContent = t; |
|||
else |
|||
if (cmd.indexOf('s') != -1) { |
|||
el.innerHTML = t; |
|||
el.classList.remove("salt-time-diff"); |
|||
ms = ms % (1000) // 除去秒数后剩余的毫秒数 |
|||
el.classList.add("salt-time-diff-done"); |
|||
finaltxt += hours + '秒' |
|||
el.setAttribute(cmdAttr, cmd); |
|||
} |
|||
el.setAttribute(startAttr, time1.toString()); |
|||
if (cmd.indexOf('M') != -1 || finaltxt.length < 1) { // 保险:若指令输入为空,则输出毫秒数 |
|||
el.setAttribute(endAttr, time2.toString()); |
|||
finaltxt += ms + '毫秒' // 剩余的毫秒数 |
|||
} |
|||
return finaltxt |
|||
} |
} |
||
} |
} |
||
docReady(() => { |
|||
if (window.saltTimeDiffNoConflictSign) |
|||
return; |
|||
else |
|||
window.saltTimeDiffNoConflictSign = true; |
|||
timeDiffHandler(); |
|||
let elems = document.querySelectorAll(".salt-time-diff-done.real-time"); |
|||
const update = () => { |
|||
for (let i = 0; i < elems.length; i++) { |
|||
setTimeout(() => { |
|||
const el = elems[i]; |
|||
const time1 = getDate(el.getAttribute(startAttr)); |
|||
const time2 = getDate(); |
|||
const cmd = el.getAttribute(cmdAttr) || "d"; |
|||
const cps = el.classList.contains("complex"); |
|||
const t = timeDiff(time1.getTime() - time2.getTime(), cmd, cps); |
|||
if (!cps) { |
|||
if (el.textContent != t) |
|||
el.textContent = t; |
|||
} else { |
|||
if (el.innerHTML != t) |
|||
el.innerHTML = t; |
|||
} |
|||
}, 0); |
|||
} |
|||
}; |
|||
setInterval(() => { |
|||
window.requestAnimationFrame ? window.requestAnimationFrame(update) : update(); |
|||
}, 50); |
|||
setInterval(() => { |
|||
if (document.querySelectorAll(".salt-time-diff").length) { |
|||
timeDiffHandler(); |
|||
} |
|||
elems = document.querySelectorAll(".salt-time-diff-done.real-time"); |
|||
}, 5e3); |
|||
}); |
|||
})(); |
|||
</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> |
2022年10月4日 (二) 16:19的版本
请使用模板{{时间差}}。
原微件搬运自我的世界玩家社区Wiki,原作者:Salt_lovely(原作者即搬运者)。