index.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. // components/date-time-picker/index.js
  2. Component({
  3. /**
  4. * 定义组件生命周期函数
  5. */
  6. lifetimes: {
  7. attached() {
  8. // =====初始化时间选择器====
  9. this._initDateTimePickerFn()
  10. },
  11. detached() {
  12. }
  13. },
  14. /**
  15. * 对 <2.2.3 版本基础库的兼容
  16. */
  17. attached() {
  18. // =====初始化时间选择器====
  19. this._initDateTimePickerFn()
  20. },
  21. detached() {
  22. },
  23. /**
  24. * 组件相关配置项
  25. */
  26. options: {
  27. multipleSlots: true // 开启使用多个插槽
  28. },
  29. /**
  30. * 组件的属性列表
  31. */
  32. properties: {
  33. mode: { // 选择器类型
  34. type: String,
  35. require: true
  36. },
  37. value: { // 回显的时间
  38. type: String,
  39. value: ''
  40. }
  41. },
  42. /**
  43. * 组件的初始数据
  44. */
  45. data: {
  46. rangeList: [],
  47. rangeValue: [],
  48. dateDetails: ['年','月', '时', '分', '秒']
  49. },
  50. /**
  51. * 组件的方法列表
  52. */
  53. methods: {
  54. /**
  55. * 初始化时间选择器
  56. */
  57. _initDateTimePickerFn() {
  58. try {
  59. const { value, mode} = this.data
  60. if (mode != 'dateminute' && mode != 'datetime') {
  61. throw new CommonException('请输入合法的时间选择器类型!', -1)
  62. }
  63. //====获取到当前时间===
  64. let showTimeValue = this._validateShowTime(value, mode)
  65. // ====获取年份====
  66. const currentYear = showTimeValue.substring(0, showTimeValue.indexOf('-'))
  67. const currentMouth = showTimeValue.split(" ")[0].split('-')[1]
  68. const yearList = this._gotDateTimeList({
  69. _start: Number(currentYear) - 100,
  70. _end: Number(currentYear) + 100, _type: 0
  71. })
  72. // ====获取月份===
  73. const monthList = this._gotDateTimeList({ _start: 1, _end: 12, _type: 1 })
  74. //====获取天数===
  75. const dayList = this._gotDayList(currentYear, currentMouth)
  76. // ====获取小时===
  77. const hourList = this._gotDateTimeList({ _start: 0, _end: 23, _type: 2 })
  78. // ====获取分钟===
  79. const munithList = this._gotDateTimeList({ _start: 0, _end: 59, _type: 3 })
  80. // ====获取秒===
  81. const secondList = this._gotDateTimeList({ _start: 0, _end: 59, _type: 4 })
  82. let rangeList = new Array()
  83. rangeList.push(yearList)
  84. rangeList.push(monthList)
  85. rangeList.push(dayList)
  86. rangeList.push(hourList)
  87. rangeList.push(munithList)
  88. mode === "datetime" && rangeList.push(secondList)
  89. this.setData({
  90. rangeList
  91. }, () => {
  92. this._echoDateTime(showTimeValue) // 初始化时间显示
  93. })
  94. } catch(err) {
  95. console.log(err)
  96. }
  97. },
  98. /**
  99. * 验证显示的时间是否合法
  100. * @param {Number} _value 要验证的时间
  101. * @param {Number} _mode 选择器类型
  102. */
  103. _validateShowTime(_value, _mode){
  104. let currentTime = formatTime(new Date()).replace(/\//g, "-")
  105. let showTimeValue = _value.trim() || currentTime
  106. const secondReg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/
  107. const munithReg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}$/
  108. if (_mode === 'dateminute') { // yyyy-MM-dd HH:mm
  109. // 验证是否合法
  110. secondReg.test(showTimeValue) && (showTimeValue = showTimeValue.substring(0, showTimeValue.lastIndexOf(':')))
  111. munithReg.test(showTimeValue) || (showTimeValue = currentTime.substring(0, currentTime.lastIndexOf(':')))
  112. } else { // yyyy-MM-dd HH:mm:ss
  113. munithReg.test(showTimeValue) && (showTimeValue += ':00')
  114. secondReg.test(showTimeValue) || (showTimeValue = currentTime)
  115. }
  116. return showTimeValue
  117. },
  118. /**
  119. * 获取年份、月份、小时、分钟、秒
  120. * @param {Number} _start 开始值
  121. * @param {Number} _end 结束值
  122. * @param {Number} _type 类型
  123. */
  124. _gotDateTimeList({_start, _end, _type}) {
  125. let resultDataList = new Array()
  126. for (let i = _start; i <= _end; i ++) {
  127. resultDataList.push(this._addZore(i) )
  128. }
  129. return resultDataList
  130. },
  131. /**
  132. * 获取天数
  133. * @param {Number} _year 年份
  134. * @param {Number} _mouth 月份
  135. */
  136. _gotDayList(_year, _mouth) {
  137. let now = new Date(_year, _mouth, 0)
  138. const dayLength = now.getDate()
  139. let dayList = new Array()
  140. for(let i = 1; i <= dayLength; i++) {
  141. dayList.push(this._addZore(i))
  142. }
  143. return dayList
  144. },
  145. /**
  146. * 补零
  147. * @param {Number} _num 数值
  148. */
  149. _addZore(_num) {
  150. return _num < 10 ? '0' + _num : _num.toString()
  151. },
  152. /**
  153. * 回显时间
  154. * @param {Number} _showTimeValue 初始化时要显示的时间
  155. */
  156. _echoDateTime(_showTimeValue) {
  157. const rangeList = this.data.rangeList
  158. let rangeValue = new Array()
  159. const list = _showTimeValue.split(/[\-|\:|\s]/)
  160. list.map((el, index) => {
  161. rangeList[index].map((item, itemIndex) => {
  162. item.indexOf(el) !== -1 && rangeValue.push(itemIndex)
  163. })
  164. })
  165. this.setData({
  166. rangeValue
  167. })
  168. },
  169. /**
  170. * 点击确定时触发的回调函数
  171. * @param {Number} ev
  172. */
  173. selectChangeFn(ev) {
  174. const selectValues = ev.detail.value
  175. const rangeList = this.data.rangeList
  176. let dateTime = ''
  177. selectValues.map((el, index) => {
  178. dateTime += rangeList[index][el].substring(0, rangeList[index][el].length)
  179. if(index == 0 || index == 1) {
  180. dateTime += '-'
  181. } else if (index == 3 || (index == 4 && index != selectValues.length - 1)) {
  182. dateTime += ':'
  183. } else if(index == 2 && index != selectValues.length -1){
  184. dateTime += ' '
  185. }
  186. })
  187. // ====触发父组件把值传递给父组件====
  188. this.triggerEvent('change', {value: dateTime})
  189. },
  190. /**
  191. * 当具体的一项的值发生改变时触发
  192. * @param {Number} ev
  193. */
  194. selectColumnChangeFn(ev) {
  195. const { column, value } = ev.detail
  196. let { rangeList, rangeValue } = this.data
  197. let selectValue = Number(rangeList[column][value]
  198. .substring(0, rangeList[column][value].length - 1))
  199. if (column === 1) { // 改变月份
  200. const currentYear = Number(rangeList[0][rangeValue[0]]
  201. .substring(0, rangeList[0][rangeValue[0]].length - 1))
  202. const dayList = this._gotDayList(currentYear, selectValue)
  203. rangeList[column + 1] = dayList
  204. }
  205. this.setData({
  206. rangeList
  207. })
  208. }
  209. }
  210. })
  211. // 自定义异常
  212. function CommonException(errMsg, code){
  213. this.errMsg = errMsg
  214. this.code = code
  215. }
  216. // =====格式化日期===
  217. const formatTime = date => {
  218. const year = date.getFullYear()
  219. const month = date.getMonth() + 1
  220. const day = date.getDate()
  221. const hour = date.getHours()
  222. const minute = date.getMinutes()
  223. const second = date.getSeconds()
  224. return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
  225. }
  226. const formatNumber = n => {
  227. n = n.toString()
  228. return n[1] ? n : '0' + n
  229. }