木灵鱼儿
阅读:1626
JavaScript 网站已运行xx年xx月xx小时xx分钟xx秒的方法
应狗群友的要求,写一个网站已经运行了多少时间的代码,本来php就完事了,非要js的。
无奈总结了下百度上的一些方法,写了一个稍微花了点心思的方法,使用很简单,new出这个函数,在使用init初始化方法,传入参数即可,完全不需要jq。
事先声明:
- 本方法没有考虑到闰年平年
- 月份统一30天计算
所以时间上可能不是很准确,但是相对准确,233
有能力完全可以自定义,我都有注释,中文友好满分。
不多说,上代码
function WebsiteElapsedTime() {
//初始化
this.init = function({
id = "",
time = ""
}) {
if (!id || !time) {
throw new Error("网站已运行时间初始化失败,请传入正确的参数!");
}
const dom = document.getElementById(id);
if (!dom) throw new Error("请传入正确的元素id");
this.dom = dom;
this.time = time;
//首次运行
this.elapsedModifyDom();
//定时器
if (window.$ElapsedTime) clearInterval(window.$ElapsedTime);
window.$ElapsedTime = setInterval(
this.elapsedModifyDom.bind(this),
1000
);
};
//计算时间
this.elapsedTime = function(time = "") {
const startTime = new Date(time.replace("-", "/")).getTime();
const diffTime = Math.floor((Date.now() - startTime) / 1000);
//总天数
const days = Math.floor(diffTime / 86400);
//计算年
const year = days >= 365 ? Math.floor(days / 365) : 0;
//计算月
const month = Math.floor((days % 365) / 30);
//计算天
const day = days - year * 365 - month * 30;
//计算小时
const hours = Math.floor(diffTime / 3600) - days * 24;
//计算分钟
const minutes = Math.floor(diffTime / 60) - days * 1440 - hours * 60;
//计算秒
const seconds =
Math.floor(diffTime) - days * 86400 - hours * 3600 - minutes * 60;
return {
year: {
name: "年",
value: year,
},
month: {
name: "月",
value: month,
},
day: {
name: "天",
value: day,
},
hours: {
name: "小时",
value: hours,
},
minutes: {
name: "分钟",
value: minutes,
},
seconds: {
name: "秒",
value: seconds,
},
};
};
//补零
this.prefixInteger = function(num, length) {
return String(num).padStart(length, "0");
};
//时间显示白名单
this.timeWhitelist = ["seconds"];
//操作dom
this.elapsedModifyDom = function() {
const eTime = this.elapsedTime(this.time);
let infoText = "";
Object.keys(eTime).forEach((key) => {
if (eTime[key].value > 0 || this.timeWhitelist.includes(key)) {
infoText +=
this.prefixInteger(eTime[key].value, 2) + eTime[key].name;
}
});
this.dom.innerHTML = `网站已运行:${infoText}`;
};
}
//使用
new WebsiteElapsedTime().init({
id: "main",
time: "2019-12-06",
});
效果图:
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
Promise失败重试,可指定重试次数
//模拟异步请求 function axiosFn() { return new Promise((resolve, reject) => { const flge = Math.random(); //随机值 setTimeout(() => { //大于0.7就是成功 if (flge > 0.7) { return resolve(flge); } else { return reject(...
animation 动画的三个事件
const div = document.querySelector("div.box"); div.addEventListener("animationstart", function() { //动画开始运行触发 }); div.addEventListener("animationiteration", function() { //动画每执行一次触发一次,适用用多次动画 }); div.addEventListener("animationend", function() { //...
手写Promise
/* * @Author: mulingyuer * @Date: 2021-12-30 22:06:58 * @LastEditTime: 2022-01-03 05:22:30 * @LastEditors: mulingyuer * @Description: 手写promise * @FilePath: \undefinedc:\Users\13219\Desktop\promise.js * 怎么可能会有bug!!! */ /** * @description: 自定义promise * @param {fucntion} executor 执行器函数(同...
深度合并对象的方法
找了很久,现有的库有两个:1. Mergenpm地址: Merge用法:import merge from 'merge'; const obj1 = { name: 2}; const obj2 = { value: 1 }; //合并 merge(obj1,obj2); console.log(obj1); //{name:2,value:1} //克隆合并-与目标对象无关联 const obj3 = merge(true,obj1,obj2); console.log(obj3); //{name:2,value:1} console.log(obj3 === obj1)...
利用JSON过滤对象和数组中指定的key属性
有时候我们在vue中进行for循环,就会涉及到绑定唯一值key的问题,但是并不是任何时候都会存在所谓的唯一值,使用index下标明显是不合适的,官方也不推荐,除非你for循环出来的列表不用变化。所以一般常用的做法就是给for循环的对象添加一个属性,属性的值是随机的uuid或者时间戳。这样前端问题解决了,如果遍历的数据还需要提交到后端,那么不就多了一个属性,这个属性后端不需要的。所以,我们需要在提交数据前,对数据进行过滤。过滤又得for循环删除?那怎么行,有没有那种通用的,简单的方法。过滤方法/** * @description: 过滤对象中指定的属性,也可以拿来浅拷贝 * @para...
Copy 一个复制操作的类
前言js有一个31k多的star的开源复制库:clipboard.js;但是一些简单复制并不想安装一个库来解决,所以就想自己写一个。copy所需要的东西Selection 对象用于获取被用户选中的部分,通过toString()方法可以获取被选中的文本内容,以及js操作选中。MDN文档:SelectionexecCommand 对象用于以命令的形式来操作网页的内容,说白了就是用它来实现复制文本操作,复制的是选中的文本MDN文档:execCommand 需要注意的是,execCommand在未来将会被遗弃,因为这个api本身是从ie浏览器那边继承的,久而久之各大浏览器都对其做了兼容,虽然...
对象扁平化
前言后端返回给前端的数据,有时候会是一个多层级对象,但是我们前端使用的时候,for循环遍历渲染时,多层级对象往往需要进行单独处理,因为还需要判断这个key值是否存在,否则会报错。强行让后端改变数据结构又好像不现实,无奈,只有自己处理了。掘金看到一位大佬文章《【算法】JS 实现对象的扁平化》感觉很合适,逻辑清晰。要求将对象中的层级扁平化,改成如下格式:// 实现一个 flatten 函数,实现如下的转换功能 const obj = { a: 1, b: [1, 2, { c: true }], c: { e: 2, f: 3 }, g: null, }; // 转换为 l...
javascript 生成随机密码,指定位数,难度(大小写、数字、特殊字符)
原理也没啥好藏着掖着的,就是为了保证密码难度,开头的字符一定是满足安全需要的,比如要求大小写数字加特殊字符,那么开头四位就一定是:大写一位、小写一位、数字一位、特殊字符一位;然后剩下的随机。/** * @description: 随机密码 * @param {*} len 密码位数 * @param {*} mode 密码难度:hide(大小写数字特殊字符)、medium(大小写数字)、low(小写数字) * @Date: 2021-07-02 15:52:32 * @Author: mulingyuer */ export const randomPass = functi...