const DAY = 24; const MINUTES = 60; const SECONDS = 60; const TIME_OF_AREA = 8 * MINUTES * SECONDS; const TIME_OF_DAY = DAY * MINUTES * SECONDS; const TIME_OF_HOUR = MINUTES * SECONDS; let TimeUtils = { _deltaTime: undefined, _shicha: undefined, _tmpCheckTime: undefined, /** * 获取本时区和北京时区的时间差 * */ GetTimeDiff () { if (!G.FuncUtils.isNumber(this._shicha)) { let offset = new Date().getTimezoneOffset() * 60; this._shicha = 28800 - offset; } return this._shicha; }, /** * 同步时间 * * @param {number} currentTime */ synTime (currentTime) { if (typeof(currentTime) != 'number' || currentTime < 10000) { return; } let myDate = new Date(); let osTime = Math.round(myDate.getTime() / 1000); this._deltaTime = osTime - currentTime; }, /** * 获取当前时间 * * @returns {number} */ getCurrentTime () { let myDate = new Date(); let osTime = Math.round(myDate.getTime() / 1000); let deltaTime = this._deltaTime; let ret = osTime - deltaTime; return ret; }, /** * 初始化检查跨天的时间 * */ initCheckIsSameDay () { this._tmpCheckTime = this.getCurrentTime(); }, /** * 判断是否跨天 * * @returns {boolean} */ isAcrossDay () { let ret = false; let currentTime = this.getCurrentTime(); if (typeof(this._tmpCheckTime) == 'number') { ret = this.isSameDay(currentTime - 5, this._tmpCheckTime); } this._tmpCheckTime = currentTime; return ret; }, /** * 判断两个时间是否同一天 * * @param {number} time1 * @param {number} time2 * @returns {boolean} */ isSameDay (time1, time2) { let day1 = this.getDay(time1); let day2 = this.getDay(time2); return (day1 == day2); }, /** * 获取天数 * * @param {number} time 秒 * @returns {number} */ getDay (time) { let day = Math.floor((time + TIME_OF_AREA) / TIME_OF_DAY); return day; }, /** * 获取当前时间的天数 * * @returns {number} */ getToday () { let currentTime = this.getCurrentTime(); let day = this.getDay(currentTime); return day; }, /** * 判断是否是今天 * * @param {number} time * @returns {boolean} */ isToday (time) { let ret = false; if (typeof(time) == 'number') { let day = this.getDay(time); let today = this.getToday(); if (today === day) { ret = true; } } return ret; }, /** * 获取日期天数差 * EX: time2如果是当前时间,表示距离今天的天数,小于0表示今天之前,大于0表示今天之后 * EX: time1如果是当前时间,表示距离今天的天数,大于0表示今天之前,小于0表示今天之后 * * @param {number} time1 * @param {number} time2 * @returns {boolean} */ getDeltaDay (time1, time2) { let day1 = this.getDay(time1); let day2 = this.getDay(time2); let ret = day1 - day2; return ret; }, /** * 根据时分秒获取时间秒数 * * @param {number} h * @param {number} m * @param {number} s * @returns {number} */ getTime (h, m, s) { let time = 0; if (typeof(h) == 'number') { time = time + h * TIME_OF_HOUR; } if (typeof(m) == 'number') { time = time + h * MINUTES; } if (typeof(s) == 'number') { time = time + s; } return time; }, /** * 获取当前时间以后的某个时间的秒数 * * @param {number} h * @param {number} m * @param {number} s * @returns {number} */ getTimeWithCurrentTimeAndDeltaTime (h, m, s) { let currentTime = this.getCurrentTime(); let ret = this.getTimeWithTimeAndDeltaTime(currentTime, h, m, s); return ret; }, /** * 获取某个时刻以后的某个时间的秒数 * * @param {number} time * @param {number} h * @param {number} m * @param {number} s * @returns {number} */ getTimeWithTimeAndDeltaTime (time, h, m, s) { let overTime = this.getTime(h, m, s); let ret = time + overTime; return ret; }, /** * 获取当天0点以后的某个时间的秒数 * * @param {number} h * @param {number} m * @param {number} s * @returns {number} */ getTimeWithCurrentDayTimeAndDeltaTime (h, m, s) { let curTime = this.getCurrentTime(); let ret = this.getTimeWithDayTimeAndDeltaTime(curTime, h, m, s); return ret; }, /** * 获取某个时刻的那天0点以后的某个时间的秒数 * * @param {number} time * @param {number} h * @param {number} m * @param {number} s * @returns {number} */ getTimeWithDayTimeAndDeltaTime (time, h, m, s) { let day = this.getDay(time); let dayTime = day * TIME_OF_DAY; let overTime = this.getTime(h, m, s); let ret = dayTime + overTime; return ret; }, /** * 获取一天过去时间 * * @param {number} time * @returns {number} */ getOneDayPastTime (time) { let today = new Date(time * 1000); today.setHours(0); today.setMinutes(0); today.setSeconds(0); let zeroTime = Math.round(today.getTime() / 1000); let pastTime = time - zeroTime; return pastTime; }, /** * @description 获取带时区的时间戳 * @author Wetion * @date 2019-06-24 * @param {Number} timestamp 需要加时区的时间戳 * @param {Number} timezone 时区 * @returns */ getTimeZone (timestamp, timezone) { let offsetGMT = new Date().getTimezoneOffset(); return new Date(timestamp * 1000 + offsetGMT * 60 * 1000 + timezone * 60 * 60 * 1000); }, /** * @description 获取倒计时文本 * @author Wetion * @date 2019-06-24 * @param {Number} startTimestamp 开始时间戳 * @param {Number} endTimestamp 结束时间戳 * @param {Number} fmt 格式化 * @returns {String} */ getCountdownText (startTimestamp, endTimestamp, fmt) { let timestamp1 = this.getTimeZone(startTimestamp, 8); // 开始时间 let timestamp2 = this.getTimeZone(endTimestamp, 8); // 结束时间 let t = timestamp2.getTime() - timestamp1.getTime(); // 时间差的毫秒数 if (t < 0) { return ''; // 时差小于等于0时返回空字符 } let d = 0, h = 0, m = 0, s = 0; d = Math.floor(t / 1000 / 3600 / 24); h = Math.floor(t / 1000 / 60 / 60 % 24); m = Math.floor(t / 1000 / 60 % 60); s = Math.floor(t / 1000 % 60); fmt = fmt || '%s'; let ret = ''; if (d > 0) { if (d === 1 && h === 0) { ret = '24小时' + m + '分'; } else { if (d > 1 && h == 0) { d -= 1; h = 24; } ret = d + '天' + h + '小时'; } } else if (h > 0) { if (h === 1 && m === 0) { ret = '60分'; } else { if (h > 1 && m === 0) { h -= 1; m = 60; } ret = h + '小时' + m + '分'; } } else if (m > 0) { if (m === 1 && s === 0) { ret = '60秒'; } else { if (m > 1 && s === 0) { m -= 1; s = 60; } ret = m + '分' + s + '秒'; } } else { ret += s + '秒'; } return cc.js.formatStr(fmt, ret); }, getGetZeroTomorrow () { let currentTime = this.getCurrentTime(); let currentDate = new Date(currentTime * 1000).toLocaleDateString(); return new Date(currentDate).getTime() / 1000 + 24 * 60 * 60; }, /** * @description 日期转时间戳(秒) * @author Wetion * @date 2019-06-19 * @param {String} dateStr 日期(date 支持的格式) * @returns */ dateToTimestamp (dateStr) { return new Date(dateStr).getTime() / 1000; }, /** * 通过时间戳格式化日期 * * @author Wetion * @date 2019-03-22 * @param {Number} timestamp 时间戳 (秒) * @param {String} fmt 例如(默认值):'%yyyy年%MM月%dd日%HH时%mm分%ss秒' * @returns {String} 格式串 */ formatToDate (timestamp, fmt) { let date = this.getTimeZone(timestamp, 8); // 结束时间,需传入时间参数 fmt = fmt || '%yyyy年%MM月%dd日%HH时%mm分%ss秒'; fmt = fmt.replace(/%yyyy/g, date.getFullYear()); fmt = fmt.replace(/%MM/g, G.FuncUtils.prefixInteger(date.getMonth() + 1, 2)); // 月份从0开始,所以加1 fmt = fmt.replace(/%dd/g, G.FuncUtils.prefixInteger(date.getDate(), 2)); fmt = fmt.replace(/%HH/g, G.FuncUtils.prefixInteger(date.getHours(), 2)); fmt = fmt.replace(/%mm/g, G.FuncUtils.prefixInteger(date.getMinutes(), 2)); fmt = fmt.replace(/%ss/g, G.FuncUtils.prefixInteger(date.getSeconds(), 2)); return fmt; }, getZeroClockTimestamp (dayFromTimestapDay, timestamp) { let currTime = timestamp; if (!currTime) { currTime = this.getCurrentTime(); } let todayPassTime = this.getOneDayPastTime(currTime); return currTime - todayPassTime + dayFromTimestapDay * TIME_OF_DAY; }, // 今天某个时刻时间戳 hour 0~24 getTodayHourTimestamp (hour) { let zeroTimestamp = this.getZeroClockTimestamp(0); return zeroTimestamp + hour * TIME_OF_HOUR; } }; module.exports = TimeUtils;