該組件適用于以下場景
1深员,將時(shí)間戳轉(zhuǎn)換成時(shí)間顯示数苫,支持年,月辨液,日虐急,天,分滔迈,秒止吁,毫秒,可以定義自己想要的格式來顯示燎悍,比如2018-03-20 18:20/2018/03/20 19:20
2敬惦,將時(shí)間轉(zhuǎn)換成時(shí)間戳顯示,
3谈山,獲取兩個(gè)時(shí)間的時(shí)間差
4俄删,在日前前面加上0,比如:2018-3-12? => 2018-03-12
js源碼
let ts = 1000 * 60 * 60 * 24;? let xs = 1000 * 60 * 60;? let fz = 1000 * 60;? let hm = 1000;? let date_list = {}; // 緩存數(shù)據(jù)
/**
* [setTime 獲取時(shí)間差]
* @param {[時(shí)間格式]} start [開始時(shí)間]
* @param {[(可為空)時(shí)間格式]} end? [結(jié)束時(shí)間]
* @param {[(可為空)數(shù)值]} poor? [差(毫秒)]
*/
function setTime(start, end, poor) {
? ? let m = 0;
? ? let _key = start + '_' + end;
? ? /** [if 檢查相對(duì)應(yīng)‘毫秒差’是否已存在緩存中奏路,不存在則獲取數(shù)據(jù)并緩存] */
? ? if (!date_list[_key]) {
?????????if (typeof end === 'undefined') { m = start * 1;
? ? ? ? ? ????? if (!m && m != 0) {m = examine(start).getTime(); }
? ?????????} else { m = examine(end).getTime() - examine(start).getTime(); // 日期時(shí)間格式 }?
????????date_list[_key] = m;
? ? } else {? m = date_list[_key]; }
? ? m = m - ((m >= 0 ? poor : -poor) || 0);
? ? let _data = { day: '0', // 天? hour: '00', // 小時(shí)? ?min: '00', // 分鐘 sec: '00', // 秒 base: m || 0 // 毫秒 };
? ? /** 開始計(jì)算 */
? ? m = Math.abs(m);
? ? if (m > 0) { let day = (m / ts) >> 0;? ?let hour = ((m - day * ts) / xs) >> 0;? ?let min = ((m - day * ts - hour * xs) / fz) >> 0;
? ? ? ? let sec = ((m - day * ts - hour * xs - min * fz) / hm) >> 0;
? ? ? ? _data.day = patchZero(day, _data.day.length);
? ? ? ? _data.hour = patchZero(hour, _data.hour.length);
? ? ? ? _data.min = patchZero(min, _data.min.length);
? ? ? ? _data.sec = patchZero(sec, _data.sec.length); }
? ? return _data; }
/**
* [examine 轉(zhuǎn)換日期]
* @param? {[]} str [支持時(shí)間戳畴椰、時(shí)間格式、Date]
* @return {[Date]}? ? [Date]
*/
function examine(str) {
? ? try {? let _date;
? ? ? ? /** [if 判斷是否已經(jīng)為時(shí)間對(duì)象] */
? ? ? ? if (typeof str === 'object' && typeof str.getTime === 'function') {? ?return str;? ?}
? ? ? ? /** [if 判斷是否為時(shí)間戳格式] */
? ? ? ? if (str >> 0) {
? ? ? ? ? ? if ((str).toString().length == 10) {? str = str * 1000;? } else { str = str * 1;? }
? ? ? ? } else {
? ? ? ? ? ? /** 為了兼容坑爹的ios */
? ? ? ? ? ? str = str.replace(/-/g, '/');
? ? ? ? }
? ? ? ? /** [if 是否不為空] */
? ? ? ? if (str && str != '0') {
? ? ? ? ? ? _date = new Date(str);
? ? ? ? ? ? if (_date == 'Invalid Date') {? console.warn('日期格式錯(cuò)誤:', str);? }
?????????????else { return _date;? }
? ? ? ? } else {? console.warn('不能為空!');? ? }
? ? } catch (err) {? console.warn(err);? }
}
/**
* [getDate 獲取相對(duì)應(yīng)的年月日等]
* @param? {[時(shí)間]} date [時(shí)間戳鸽粉、時(shí)間格式字符串斜脂、]
* @param? {[字符串]} fmt? [編號(hào)成的時(shí)間格式,第一個(gè)為!時(shí)]
* @return {[對(duì)象]}? ? ? [description]
*/
function getDate(date, fmt = '!y-M-d h:m:s.S') {
? ? let _date = examine(date);
? ? if (_date) {? ?let _regfun;
? ? ? ? let o = {? ?'y': _date.getFullYear(), // 年份? ?'M': _date.getMonth() + 1, // 月份? 'd': _date.getDate(), // 日? ?'h': _date.getHours(), // 小時(shí)
? ? ? ? ? ? 'm': _date.getMinutes(), // 分? 's': _date.getSeconds(), // 秒? ?'q': Math.floor((_date.getMonth() + 3) / 3), // 季度
? ? ? ? ? ? 'S': _date.getMilliseconds() // 毫秒 };
? ? ? ? if (fmt.charAt(0) === '!') {? _regfun = patchZero; fmt = fmt.slice(1);
? ? ? ? ????} else { _regfun = function (a, l) {? ?return ('00000' + a).slice(-l); };
? ? ? ? }
? ? ? ? for (let k in o) {
? ? ? ? ? ? if (new RegExp('(' + k + '+)').test(fmt)) {? fmt = fmt.replace(? RegExp.$1, _regfun(o[k], RegExp.$1.length)? ); }
? ? ? ? }
? ? ? ? o.fmt = fmt;
? ? ? ? return o;? }
}
/**
* [patchZero 前面加0]
* @param? {[type]} a [description]
* @param? {[type]} l [description]
* @return {[type]}? [description]
*/
function patchZero(a, l) {
? ? for (let i = (a).toString().length; i < l; i++) {? a = '0' + a; };
? ? return a;
}
module.exports = {
? ? setTime: setTime,? // 獲取時(shí)間差
? ? getDate: getDate,? // 獲取相對(duì)應(yīng)的年月日等
? ? patchZero: patchZero, // 前面加0
? ? examine: examine? // 轉(zhuǎn)換日期
};
后續(xù)應(yīng)該會(huì)直接給個(gè)git鏈接的触机,現(xiàn)在現(xiàn)在簡書上練練手帚戳,不太怎么會(huì)寫文章,之后能力有所提升的話儡首,會(huì)在git上分享更多片任,更深的東西
示例
js命名為timeDeal.js
import?getDate from './timeDeal'
const currentData = +new Date(); // 獲取當(dāng)前時(shí)間戳
const time =?getDate( currentData? , 'yyyy.M.dd hh:mm').fmt