TimeUtils.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. const DAY = 24;
  2. const MINUTES = 60;
  3. const SECONDS = 60;
  4. const TIME_OF_AREA = 8 * MINUTES * SECONDS;
  5. const TIME_OF_DAY = DAY * MINUTES * SECONDS;
  6. const TIME_OF_HOUR = MINUTES * SECONDS;
  7. let TimeUtils = {
  8. _deltaTime: undefined,
  9. _shicha: undefined,
  10. _tmpCheckTime: undefined,
  11. /**
  12. * 获取本时区和北京时区的时间差
  13. *
  14. */
  15. GetTimeDiff () {
  16. if (!G.FuncUtils.isNumber(this._shicha)) {
  17. let offset = new Date().getTimezoneOffset() * 60;
  18. this._shicha = 28800 - offset;
  19. }
  20. return this._shicha;
  21. },
  22. /**
  23. * 同步时间
  24. *
  25. * @param {number} currentTime
  26. */
  27. synTime (currentTime) {
  28. if (typeof(currentTime) != 'number' || currentTime < 10000) {
  29. return;
  30. }
  31. let myDate = new Date();
  32. let osTime = Math.round(myDate.getTime() / 1000);
  33. this._deltaTime = osTime - currentTime;
  34. },
  35. /**
  36. * 获取当前时间
  37. *
  38. * @returns {number}
  39. */
  40. getCurrentTime () {
  41. let myDate = new Date();
  42. let osTime = Math.round(myDate.getTime() / 1000);
  43. let deltaTime = this._deltaTime;
  44. let ret = osTime - deltaTime;
  45. return ret;
  46. },
  47. /**
  48. * 初始化检查跨天的时间
  49. *
  50. */
  51. initCheckIsSameDay () {
  52. this._tmpCheckTime = this.getCurrentTime();
  53. },
  54. /**
  55. * 判断是否跨天
  56. *
  57. * @returns {boolean}
  58. */
  59. isAcrossDay () {
  60. let ret = false;
  61. let currentTime = this.getCurrentTime();
  62. if (typeof(this._tmpCheckTime) == 'number') {
  63. ret = this.isSameDay(currentTime - 5, this._tmpCheckTime);
  64. }
  65. this._tmpCheckTime = currentTime;
  66. return ret;
  67. },
  68. /**
  69. * 判断两个时间是否同一天
  70. *
  71. * @param {number} time1
  72. * @param {number} time2
  73. * @returns {boolean}
  74. */
  75. isSameDay (time1, time2) {
  76. let day1 = this.getDay(time1);
  77. let day2 = this.getDay(time2);
  78. return (day1 == day2);
  79. },
  80. /**
  81. * 获取天数
  82. *
  83. * @param {number} time 秒
  84. * @returns {number}
  85. */
  86. getDay (time) {
  87. let day = Math.floor((time + TIME_OF_AREA) / TIME_OF_DAY);
  88. return day;
  89. },
  90. /**
  91. * 获取当前时间的天数
  92. *
  93. * @returns {number}
  94. */
  95. getToday () {
  96. let currentTime = this.getCurrentTime();
  97. let day = this.getDay(currentTime);
  98. return day;
  99. },
  100. /**
  101. * 判断是否是今天
  102. *
  103. * @param {number} time
  104. * @returns {boolean}
  105. */
  106. isToday (time) {
  107. let ret = false;
  108. if (typeof(time) == 'number') {
  109. let day = this.getDay(time);
  110. let today = this.getToday();
  111. if (today === day) {
  112. ret = true;
  113. }
  114. }
  115. return ret;
  116. },
  117. /**
  118. * 获取日期天数差
  119. * EX: time2如果是当前时间,表示距离今天的天数,小于0表示今天之前,大于0表示今天之后
  120. * EX: time1如果是当前时间,表示距离今天的天数,大于0表示今天之前,小于0表示今天之后
  121. *
  122. * @param {number} time1
  123. * @param {number} time2
  124. * @returns {boolean}
  125. */
  126. getDeltaDay (time1, time2) {
  127. let day1 = this.getDay(time1);
  128. let day2 = this.getDay(time2);
  129. let ret = day1 - day2;
  130. return ret;
  131. },
  132. /**
  133. * 根据时分秒获取时间秒数
  134. *
  135. * @param {number} h
  136. * @param {number} m
  137. * @param {number} s
  138. * @returns {number}
  139. */
  140. getTime (h, m, s) {
  141. let time = 0;
  142. if (typeof(h) == 'number') {
  143. time = time + h * TIME_OF_HOUR;
  144. }
  145. if (typeof(m) == 'number') {
  146. time = time + h * MINUTES;
  147. }
  148. if (typeof(s) == 'number') {
  149. time = time + s;
  150. }
  151. return time;
  152. },
  153. /**
  154. * 获取当前时间以后的某个时间的秒数
  155. *
  156. * @param {number} h
  157. * @param {number} m
  158. * @param {number} s
  159. * @returns {number}
  160. */
  161. getTimeWithCurrentTimeAndDeltaTime (h, m, s) {
  162. let currentTime = this.getCurrentTime();
  163. let ret = this.getTimeWithTimeAndDeltaTime(currentTime, h, m, s);
  164. return ret;
  165. },
  166. /**
  167. * 获取某个时刻以后的某个时间的秒数
  168. *
  169. * @param {number} time
  170. * @param {number} h
  171. * @param {number} m
  172. * @param {number} s
  173. * @returns {number}
  174. */
  175. getTimeWithTimeAndDeltaTime (time, h, m, s) {
  176. let overTime = this.getTime(h, m, s);
  177. let ret = time + overTime;
  178. return ret;
  179. },
  180. /**
  181. * 获取当天0点以后的某个时间的秒数
  182. *
  183. * @param {number} h
  184. * @param {number} m
  185. * @param {number} s
  186. * @returns {number}
  187. */
  188. getTimeWithCurrentDayTimeAndDeltaTime (h, m, s) {
  189. let curTime = this.getCurrentTime();
  190. let ret = this.getTimeWithDayTimeAndDeltaTime(curTime, h, m, s);
  191. return ret;
  192. },
  193. /**
  194. * 获取某个时刻的那天0点以后的某个时间的秒数
  195. *
  196. * @param {number} time
  197. * @param {number} h
  198. * @param {number} m
  199. * @param {number} s
  200. * @returns {number}
  201. */
  202. getTimeWithDayTimeAndDeltaTime (time, h, m, s) {
  203. let day = this.getDay(time);
  204. let dayTime = day * TIME_OF_DAY;
  205. let overTime = this.getTime(h, m, s);
  206. let ret = dayTime + overTime;
  207. return ret;
  208. },
  209. /**
  210. * 获取一天过去时间
  211. *
  212. * @param {number} time
  213. * @returns {number}
  214. */
  215. getOneDayPastTime (time) {
  216. let today = new Date(time * 1000);
  217. today.setHours(0);
  218. today.setMinutes(0);
  219. today.setSeconds(0);
  220. let zeroTime = Math.round(today.getTime() / 1000);
  221. let pastTime = time - zeroTime;
  222. return pastTime;
  223. },
  224. /**
  225. * @description 获取带时区的时间戳
  226. * @author Wetion
  227. * @date 2019-06-24
  228. * @param {Number} timestamp 需要加时区的时间戳
  229. * @param {Number} timezone 时区
  230. * @returns
  231. */
  232. getTimeZone (timestamp, timezone) {
  233. let offsetGMT = new Date().getTimezoneOffset();
  234. return new Date(timestamp * 1000 + offsetGMT * 60 * 1000 + timezone * 60 * 60 * 1000);
  235. },
  236. /**
  237. * @description 获取倒计时文本
  238. * @author Wetion
  239. * @date 2019-06-24
  240. * @param {Number} startTimestamp 开始时间戳
  241. * @param {Number} endTimestamp 结束时间戳
  242. * @param {Number} fmt 格式化
  243. * @returns {String}
  244. */
  245. getCountdownText (startTimestamp, endTimestamp, fmt) {
  246. let timestamp1 = this.getTimeZone(startTimestamp, 8); // 开始时间
  247. let timestamp2 = this.getTimeZone(endTimestamp, 8); // 结束时间
  248. let t = timestamp2.getTime() - timestamp1.getTime(); // 时间差的毫秒数
  249. if (t < 0) {
  250. return ''; // 时差小于等于0时返回空字符
  251. }
  252. let d = 0, h = 0, m = 0, s = 0;
  253. d = Math.floor(t / 1000 / 3600 / 24);
  254. h = Math.floor(t / 1000 / 60 / 60 % 24);
  255. m = Math.floor(t / 1000 / 60 % 60);
  256. s = Math.floor(t / 1000 % 60);
  257. fmt = fmt || '%s';
  258. let ret = '';
  259. if (d > 0) {
  260. if (d === 1 && h === 0) {
  261. ret = '24小时' + m + '分';
  262. } else {
  263. if (d > 1 && h == 0) {
  264. d -= 1;
  265. h = 24;
  266. }
  267. ret = d + '天' + h + '小时';
  268. }
  269. } else if (h > 0) {
  270. if (h === 1 && m === 0) {
  271. ret = '60分';
  272. } else {
  273. if (h > 1 && m === 0) {
  274. h -= 1;
  275. m = 60;
  276. }
  277. ret = h + '小时' + m + '分';
  278. }
  279. } else if (m > 0) {
  280. if (m === 1 && s === 0) {
  281. ret = '60秒';
  282. } else {
  283. if (m > 1 && s === 0) {
  284. m -= 1;
  285. s = 60;
  286. }
  287. ret = m + '分' + s + '秒';
  288. }
  289. } else {
  290. ret += s + '秒';
  291. }
  292. return cc.js.formatStr(fmt, ret);
  293. },
  294. getGetZeroTomorrow () {
  295. let currentTime = this.getCurrentTime();
  296. let currentDate = new Date(currentTime * 1000).toLocaleDateString();
  297. return new Date(currentDate).getTime() / 1000 + 24 * 60 * 60;
  298. },
  299. /**
  300. * @description 日期转时间戳(秒)
  301. * @author Wetion
  302. * @date 2019-06-19
  303. * @param {String} dateStr 日期(date 支持的格式)
  304. * @returns
  305. */
  306. dateToTimestamp (dateStr) {
  307. return new Date(dateStr).getTime() / 1000;
  308. },
  309. /**
  310. * 通过时间戳格式化日期
  311. *
  312. * @author Wetion
  313. * @date 2019-03-22
  314. * @param {Number} timestamp 时间戳 (秒)
  315. * @param {String} fmt 例如(默认值):'%yyyy年%MM月%dd日%HH时%mm分%ss秒'
  316. * @returns {String} 格式串
  317. */
  318. formatToDate (timestamp, fmt) {
  319. let date = this.getTimeZone(timestamp, 8); // 结束时间,需传入时间参数
  320. fmt = fmt || '%yyyy年%MM月%dd日%HH时%mm分%ss秒';
  321. fmt = fmt.replace(/%yyyy/g, date.getFullYear());
  322. fmt = fmt.replace(/%MM/g, G.FuncUtils.prefixInteger(date.getMonth() + 1, 2)); // 月份从0开始,所以加1
  323. fmt = fmt.replace(/%dd/g, G.FuncUtils.prefixInteger(date.getDate(), 2));
  324. fmt = fmt.replace(/%HH/g, G.FuncUtils.prefixInteger(date.getHours(), 2));
  325. fmt = fmt.replace(/%mm/g, G.FuncUtils.prefixInteger(date.getMinutes(), 2));
  326. fmt = fmt.replace(/%ss/g, G.FuncUtils.prefixInteger(date.getSeconds(), 2));
  327. return fmt;
  328. },
  329. getZeroClockTimestamp (dayFromTimestapDay, timestamp) {
  330. let currTime = timestamp;
  331. if (!currTime) {
  332. currTime = this.getCurrentTime();
  333. }
  334. let todayPassTime = this.getOneDayPastTime(currTime);
  335. return currTime - todayPassTime + dayFromTimestapDay * TIME_OF_DAY;
  336. },
  337. // 今天某个时刻时间戳 hour 0~24
  338. getTodayHourTimestamp (hour) {
  339. let zeroTimestamp = this.getZeroClockTimestamp(0);
  340. return zeroTimestamp + hour * TIME_OF_HOUR;
  341. }
  342. };
  343. module.exports = TimeUtils;