dateUtils.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /**
  2. * @Author: NanKeYang
  3. * @Description:
  4. * @Data: 2020/1/13 16:50
  5. */
  6. layui.define([], function (exports) {
  7. function addZero(num) {
  8. return num >= 0 && num < 10 ? "0" + num : String(num);
  9. }
  10. /** 中文配置 */
  11. var zh = {
  12. dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
  13. dayNames: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
  14. monthNamesShort: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
  15. monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
  16. amPm: ['am', 'pm'],
  17. DoFn: function DoFn(D) {
  18. return D + ['th', 'st', 'nd', 'rd'][D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10];
  19. }
  20. }
  21. /** 英文配置 */
  22. var en = {
  23. dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat'],
  24. dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
  25. monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  26. monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
  27. amPm: ['am', 'pm'],
  28. DoFn: function DoFn(D) {
  29. return D + ['th', 'st', 'nd', 'rd'][D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10];
  30. }
  31. }
  32. /**
  33. * 时间戳转日期
  34. * @param {date} value 时间戳
  35. * @param {string} format 格式化
  36. *
  37. * format格式如下:
  38. * 1."yyyy-MM-dd hh:mm:ss"
  39. * 2."yyyy年MM月dd日"
  40. * 3."MM/dd/yyyy"
  41. * 4."yyyyMMdd"
  42. * 5."hh:mm:ss"
  43. */
  44. function dateFormat(value, format) {
  45. if (typeof value == 'string') value = Number(value);
  46. if (!format) format = "yyyy-MM-dd hh:mm:ss"
  47. var date = new Date(value);
  48. var o = {
  49. "M+": date.getMonth() + 1, //month
  50. "d+": date.getDate(), //day
  51. "h+": date.getHours(), //hour
  52. "m+": date.getMinutes(), //minute
  53. "s+": date.getSeconds(), //second
  54. "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
  55. "S": date.getMilliseconds() //millisecond
  56. }
  57. if (/(y+)/.test(format)) {
  58. format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
  59. }
  60. for (var k in o) {
  61. if (new RegExp("(" + k + ")").test(format)) {
  62. format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
  63. }
  64. }
  65. return format;
  66. }
  67. /**
  68. * 是否是同一天
  69. * @param {date} a 日期a
  70. * @param {date} b 日期b
  71. * @return {boolean} 是否是同一天
  72. */
  73. function isSameDay(a, b) {
  74. return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
  75. }
  76. /**
  77. * 获取指定时间年月日
  78. * @param {date} time 时间
  79. * @return {string} yyyy-mm-dd
  80. */
  81. function getCurrentDay(time) {
  82. time = time || new Date();
  83. var month = time.getMonth() + 1;
  84. month = addZero(month);
  85. var day = time.getDate();
  86. day = addZero(day);
  87. var year = time.getFullYear();
  88. return year + '-' + month + '-' + day;
  89. }
  90. /**
  91. * 日期转时间戳,毫秒
  92. * @param {date} date 日期格式 yyyy-MM-dd hh:mm:ss
  93. */
  94. function getTimestamp(date) {
  95. return Date.parse(date)
  96. }
  97. /**
  98. * 获取指定时间属于周几
  99. * @param {date} time 日期
  100. * @param {string} language 语言,可以不传入
  101. */
  102. function getCurrentWeek(time, language) {
  103. time = time || new Date()
  104. if (!language) return time.getDay()
  105. const week = language === 'zh' ? zh.dayNamesShort : en.dayNamesShort
  106. return week[time.getDay()]
  107. }
  108. /**
  109. * 获取当前指定的前几天的日期
  110. * @param {number} num 前几天
  111. */
  112. function getBeforeDate(num) {
  113. if (typeof num === 'string') num = Number(num)
  114. const n = num
  115. const d = new Date()
  116. let year = d.getFullYear()
  117. let mon = d.getMonth() + 1
  118. let day = d.getDate()
  119. if (day <= n) {
  120. if (mon > 1) {
  121. mon = mon - 1
  122. } else {
  123. year = year - 1
  124. mon = 12
  125. }
  126. }
  127. d.setDate(d.getDate() - n)
  128. year = d.getFullYear()
  129. mon = d.getMonth() + 1
  130. day = d.getDate()
  131. s = year + "-" + (mon < 10 ? ('0' + mon) : mon) + "-" + (day < 10 ? ('0' + day) : day)
  132. return s
  133. }
  134. /**
  135. * 格式化周几到周几
  136. * @param {Array} data
  137. * @runkit true
  138. * @example
  139. * const { formatWeek } = require('happy-utils/date')
  140. * formatWeek([1,2,3,4,5,6]);
  141. * // => "周一至周六"
  142. * formatWeek([1,2,4,5,6]);
  143. * // => "周一、周二、周四至周六"
  144. * formatWeek([1,2,3,,6, 7]);
  145. * // => "周一至周三、周六、周日"
  146. */
  147. function formatWeek(data) {
  148. let flag, midArray, newArray = [], string = ''
  149. const array = data.sort((a, b) => {
  150. return a - b
  151. })
  152. const weekStringArr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  153. array.map((v) => {
  154. if (flag === parseInt(v)) {
  155. midArray.push(flag)
  156. flag++
  157. return
  158. }
  159. midArray = [parseInt(v)]
  160. flag = parseInt(v) + 1
  161. newArray.push(midArray)
  162. })
  163. for (var value of newArray) {
  164. if (value.length >= 3) {
  165. string += weekStringArr[value[0] - 1] + '至' + weekStringArr[value[value.length - 1] - 1] + '、'
  166. } else if (value.length == 2) {
  167. string += weekStringArr[value[0] - 1] + '、' + weekStringArr[value[1] - 1] + '、'
  168. } else if (value.length == 1) {
  169. string += weekStringArr[value[0] - 1] + '、'
  170. }
  171. }
  172. return string.substr(0, string.length - 1)
  173. }
  174. /**
  175. * 格式化时间,几点到几点
  176. * @param {Array} data
  177. * @runkit true
  178. * @example
  179. * const { formatTimes } = require('happy-utils/date')
  180. * formatTimes([{"startTime":"08:00","endTime":"20:00"}]);
  181. * // => "08:00至20:00"
  182. * formatTimes([{"startTime":"08:00","endTime":"20:00"}, {"startTime":"07:00","endTime":"21:00"}]);
  183. * // => "08:00至20:00、07:00至21:00"
  184. */
  185. function formatTimes(data) {
  186. let string = '';
  187. for (var i = 0; i < data.length; i++) {
  188. string += data[i].startTime + '至' + data[i].endTime + '、';
  189. }
  190. return string.substr(0, string.length - 1);
  191. }
  192. /**
  193. * 格式化距现在的已过时间
  194. * @param {Date} startTime
  195. * @return {String}
  196. * @runkit true
  197. * @example
  198. * const { formatPassTime } = require('happy-utils/date')
  199. * formatPassTime(new Date());
  200. * // => "刚刚"
  201. * formatPassTime(new Date('2016-07-01'));
  202. * // => "1年前"
  203. */
  204. function formatPassTime(startTime) {
  205. const currentTime = Date.parse(new Date()),
  206. time = currentTime - startTime,
  207. day = parseInt(time / (1000 * 60 * 60 * 24)),
  208. hour = parseInt(time / (1000 * 60 * 60)),
  209. min = parseInt(time / (1000 * 60)),
  210. month = parseInt(day / 30),
  211. year = parseInt(month / 12);
  212. if (year) return year + "年前"
  213. if (month) return month + "个月前"
  214. if (day) return day + "天前"
  215. if (hour) return hour + "小时前"
  216. if (min) return min + "分钟前"
  217. else return '刚刚'
  218. }
  219. // 封装方法
  220. var mod = {
  221. zh,
  222. en,
  223. isSameDay,
  224. getCurrentDay,
  225. dateFormat,
  226. getTimestamp,
  227. getCurrentWeek,
  228. getBeforeDate,
  229. formatWeek,
  230. formatTimes,
  231. formatPassTime,
  232. }
  233. // 输出
  234. exports('dateUtils', mod);
  235. });