当前位置:   article > 正文

微信小程序自定义日期选择器组件_微信小程序日期时间选择器

微信小程序日期时间选择器

效果图 

  • 默认开始时间为当天
  • 最大结束时间为当天
  • 默认结束时间为开始时间的10后

wxml 

  1. <view class="container">
  2. <view class="page-body">
  3. <view class="selected-date" id='1' bindtap="btnTap" class="second_1_1 {{btn_type=='1'?'second_1_2':''}}">{{year}}年{{month}}月{{day}}日{{hour}}时{{minute}}分</view>
  4. <view class="selected-date" id='2' bindtap="btnTap" class="second_1_1 {{btn_type=='2'?'second_1_2':''}}">{{year2}}年{{month2}}月{{day2}}日{{hour2}}时{{minute2}}分</view>
  5. <picker-view indicator-style="height: 50px;" style="width: 100%; height: 300px;" value="{{value}}" bindchange="bindChange" id='1' wx:if="{{btn_type==1}}">
  6. <picker-view-column>
  7. <view wx:for="{{years}}" wx:key="{{years}}" style="line-height: 50px; text-align: center;" wx:key="years">{{item}}年</view>
  8. </picker-view-column>
  9. <picker-view-column>
  10. <view wx:for="{{months}}" wx:key="{{months}}" style="line-height: 50px; text-align: center;"wx:key="months">{{item}}月</view>
  11. </picker-view-column>
  12. <picker-view-column>
  13. <view wx:for="{{days}}" wx:key="{{days}}" style="line-height: 50px; text-align: center;" wx:key="days">{{item}}日</view>
  14. </picker-view-column>
  15. <picker-view-column>
  16. <view wx:for="{{hours}}" wx:key="index" style="line-height: 50px; text-align: center;">{{item}}时</view>
  17. </picker-view-column>
  18. <picker-view-column>
  19. <view wx:for="{{minutes}}" wx:key="index" style="line-height: 50px; text-align: center;">{{item}}分</view>
  20. </picker-view-column>
  21. </picker-view >
  22. <picker-view indicator-style="height: 50px;" style="width: 100%; height: 300px;" value="{{value2}}" bindchange="bindChange2" id='2' wx:else>
  23. <picker-view-column>
  24. <view wx:for="{{years2}}" wx:key="{{years2}}" style="line-height: 50px; text-align: center;" wx:key="years2">{{item}}年</view>
  25. </picker-view-column>
  26. <picker-view-column>
  27. <view wx:for="{{months2}}" wx:key="{{months2}}" style="line-height: 50px; text-align: center;"wx:key="months2">{{item}}月</view>
  28. </picker-view-column>
  29. <picker-view-column>
  30. <view wx:for="{{days2}}" wx:key="{{days2}}" style="line-height: 50px; text-align: center;" wx:key="days2">{{item}}日</view>
  31. </picker-view-column>
  32. <picker-view-column>
  33. <view wx:for="{{hours}}" wx:key="index" style="line-height: 50px; text-align: center;">{{item}}时</view>
  34. </picker-view-column>
  35. <picker-view-column>
  36. <view wx:for="{{minutes}}" wx:key="index" style="line-height: 50px; text-align: center;">{{item}}分</view>
  37. </picker-view-column>
  38. </picker-view>
  39. </view>
  40. </view>

 js

  1. const date = new Date()
  2. const globaltimer = new Date().getTime()
  3. const globalyear = date.getFullYear()
  4. const globalmonth = date.getMonth() + 1
  5. const globalday = date.getDate()
  6. function getDays(year, month) {
  7. var d = new Date(year, month, 0);
  8. return (year == globalyear && month == globalmonth) ? globalday : d.getDate();
  9. }
  10. function getIndex(arr, item) {
  11. for (var i in arr) {
  12. if (arr[i] == item) {
  13. return i;
  14. }
  15. }
  16. }
  17. // for (let i = 1; i <= 31; i++) {
  18. // days.push(i)
  19. // }
  20. Page({
  21. data: {
  22. years: [],
  23. year: globalyear,
  24. months: [],
  25. month: globalmonth,
  26. days: [],
  27. day: globalday,
  28. value: [],
  29. // ----
  30. years2: [],
  31. year2: globalyear,
  32. months2: [],
  33. month2: globalmonth,
  34. days2: [],
  35. day2: globalday,
  36. value2: [],
  37. btn_type: '1',
  38. hours: [],
  39. minutes: [],
  40. hour: '00',
  41. minute: "00",
  42. hour2: '23',
  43. minute2: "59"
  44. },
  45. // 切换事件
  46. btnTap: function (e) {
  47. var that = this;
  48. let data = this.data
  49. console.log(e);
  50. // 初始化选择器索引
  51. var btn_id = e.currentTarget.id;
  52. let n_yindex = data.years2.indexOf(data.year2)
  53. let n_mindex = data.months2.indexOf(data.month2)
  54. let n_dindex = data.days2.indexOf(data.day2)
  55. let n_minindex = getIndex(data.minutes, data.minute2)
  56. let n_hourindex = getIndex(data.hours, data.hour2)
  57. console.log(n_minindex, "[[[[[");
  58. let o_yndex = data.years.indexOf(data.year)
  59. let o_mindex = data.months.indexOf(data.month)
  60. let o_dindex = data.days.indexOf(data.day)
  61. let o_minindex = getIndex(data.minutes, data.minute)
  62. let o_hourindex = getIndex(data.hours, data.hour)
  63. that.setData({
  64. btn_type: btn_id,
  65. value2: [
  66. n_yindex, n_mindex, n_dindex, n_hourindex, n_minindex,
  67. ],
  68. value: [
  69. o_yndex, o_mindex, o_dindex, o_hourindex, o_minindex,
  70. ]
  71. });
  72. console.log(this.data.value2);
  73. },
  74. //获取小时
  75. currentHours: function (date) {
  76. let hours = []
  77. let that = this
  78. for (let i = 0; i <= 23; i++) {
  79. var k = i;
  80. if (0 <= i && i < 10) {
  81. k = "0" + i
  82. }
  83. hours.push(k)
  84. }
  85. that.setData({
  86. hours: hours
  87. });
  88. },
  89. //获取分钟
  90. currentMinutes: function (date) {
  91. let minutes = []
  92. let that = this
  93. for (let i = 0; i <= 59; i++) {
  94. var k = i;
  95. if (0 <= i && i < 10) {
  96. k = "0" + i
  97. }
  98. minutes.push(k)
  99. }
  100. that.setData({
  101. minutes: minutes
  102. });
  103. },
  104. // 获取十天后的日期
  105. getAllDateCN(startTime, endTime) {
  106. let that = this
  107. let o_days = []
  108. let n_days = []
  109. let e_year, e_month, e_day
  110. var i = 0
  111. while ((endTime.getTime() - startTime.getTime()) >= 0) {
  112. if (endTime.getMonth() != startTime.getMonth()) {
  113. o_days.push(startTime.getDate())
  114. } else {
  115. n_days.push(startTime.getDate())
  116. }
  117. e_year = endTime.getFullYear()
  118. e_month = endTime.getMonth() + 1
  119. e_day = endTime.getDate()
  120. startTime.setDate(startTime.getDate() + 1)
  121. i += 1
  122. }
  123. that.setData({
  124. year2: e_year,
  125. month2: e_month,
  126. day2: e_day,
  127. o_days: o_days,
  128. n_days: n_days,
  129. e_year: e_year,
  130. e_month: e_month,
  131. })
  132. return { o_days, n_days, e_year, e_month, }
  133. },
  134. onShow() {
  135. // 初始化选择器数组
  136. this.initYears1()
  137. this.initMonths1()
  138. this.currentHours()
  139. this.currentMinutes()
  140. this.initDays1(globalyear, globalmonth)
  141. let { years, months, days, hours, minutes } = this.data
  142. this.setData({
  143. value: [years.length - 1, months.length - 1, days.length - 1, hours[0], minutes[0]],
  144. years2: [globalyear],
  145. months2: [globalmonth],
  146. days2: [globalday],
  147. o_days: [globalday]
  148. })
  149. },
  150. // 初始化开始年
  151. initYears1() {
  152. let { years, } = this.data
  153. for (let i = 2016; i <= globalyear; i++) {
  154. years.push(i)
  155. }
  156. this.setData({ years })
  157. },
  158. //初始化开始月
  159. initMonths1() {
  160. let { year, months, } = this.data
  161. months.length = 0
  162. if (year == globalyear) {
  163. for (let i = 1; i <= globalmonth; i++) {
  164. months.push(i)
  165. }
  166. } else {
  167. for (let i = 1; i <= 12; i++) {
  168. months.push(i)
  169. }
  170. }
  171. this.setData({ months })
  172. },
  173. // 初始化日
  174. initDays1(year, month) {
  175. let { days } = this.data
  176. days.length = 0
  177. let len = year ? getDays(year, month) : getDays(globalyear, globalmonth)
  178. for (let i = 1; i <= len; i++) {
  179. days.push(i)
  180. }
  181. this.setData({ days })
  182. },
  183. // 开始时间选择器事件
  184. bindChange(e) {
  185. if (this.data.btn_type == '1') {
  186. let val = e.detail.value,
  187. year = this.data.years[val[0]],
  188. month = this.data.months[val[1]],
  189. day = this.data.days[val[2]],
  190. hour = this.data.hours[val[3]],
  191. minute = this.data.minutes[val[4]];
  192. this.setData({ year, month, day, hour, minute })
  193. this.initMonths1()
  194. this.initDays1(year, month)
  195. let n_timer = null
  196. let nowTime = new Date(`${year}/${month}/${day}`)
  197. var lastTime = new Date(Date.parse(nowTime) + 9 * 24 * 60 * 60 * 1000)
  198. if (lastTime.getTime() > globaltimer) {
  199. n_timer = new Date()
  200. } else {
  201. n_timer = lastTime
  202. }
  203. let res = this.getAllDateCN(nowTime, n_timer)
  204. let datae = { year, month, day, ...res }
  205. this.initYears2(datae)
  206. this.initMonths2(datae)
  207. this.initDays2(datae)
  208. }
  209. let data = this.data
  210. this.setData({
  211. hour2: '23',
  212. minute2: '59'
  213. })
  214. },
  215. // 初始化结束年
  216. initYears2(data) {
  217. let { e_year, year } = data
  218. let { years2, } = this.data
  219. years2 = []
  220. if (e_year == year) {
  221. years2.push(e_year)
  222. } else {
  223. years2.push(year, e_year)
  224. }
  225. this.setData({
  226. years2
  227. })
  228. },
  229. //初始化结束月
  230. initMonths2(datae) {
  231. let { e_month, month, e_year, year } = datae
  232. let { months2, } = this.data
  233. months2 = []
  234. if (e_month == month) {//没跨月
  235. months2.push(e_month)
  236. } else if (e_year != year) { //跨年
  237. months2.push(e_month)
  238. } else {//跨月
  239. months2.push(month, e_month)
  240. }
  241. this.setData({
  242. months2
  243. })
  244. },
  245. // 初始化结束天
  246. initDays2(datae) {
  247. let { o_days, n_days } = datae
  248. console.log(o_days, n_days);
  249. let { days2 } = this.data
  250. days2 = []
  251. days2 = n_days
  252. this.setData({
  253. days2
  254. })
  255. },
  256. // 变动后初始化月
  257. changeYear2(year2) {
  258. let { months2, year, month, e_year, e_month } = this.data
  259. months2 = []
  260. if (year == e_year && month != e_month) {//跨月
  261. months2.push(month, e_month)
  262. } else {
  263. console.log('else', year2, year);
  264. if (year2 == year) {
  265. months2.push(month)
  266. } else {
  267. months2.push(e_month)
  268. }
  269. }
  270. this.setData({
  271. months2
  272. })
  273. },
  274. // 变动后初始化天
  275. changeDays2(month2) {
  276. let { days2, o_days, n_days, month } = this.data
  277. days2 = []
  278. console.log(days2, '=====');
  279. if (month2 == month) {
  280. days2 = o_days
  281. } else {
  282. days2 = n_days
  283. }
  284. //没跨月
  285. if (days2.length == 0) {
  286. days2 = n_days
  287. }
  288. this.setData({
  289. days2
  290. })
  291. },
  292. // 结束时间选择器事件
  293. bindChange2(e) {
  294. if (this.data.btn_type == '2') {
  295. console.log(e);
  296. let val = e.detail.value,
  297. year2 = this.data.years2[val[0]]
  298. this.changeYear2(year2)
  299. let month2 = this.data.months2[val[1]]
  300. this.changeDays2(month2)
  301. console.log(this.data.days2, '------- 天数 数组');
  302. console.log(this.data.days2[val[2]], '??????');
  303. let day2 = this.data.days2[val[2]];
  304. let hour2 = this.data.hours[val[3]]
  305. let minute2 = this.data.minutes[val[4]];
  306. console.log(year2, month2, day2);
  307. this.setData({
  308. year2, month2, day2, hour2, minute2
  309. })
  310. }
  311. },
  312. })

wxss

  1. /* pages/picker-view/picker-view.wxss */
  2. .selected-date {
  3. width: 600rpx;
  4. height: 80rpx;
  5. border: 2rpx solid #ccc;
  6. margin: 100rpx auto;
  7. text-align: center;
  8. line-height: 80rpx;
  9. }
  10. .btn_active {
  11. border: 2rpx solid #f00;
  12. color: #f00;
  13. }
  14. .second_1_2 {
  15. width: 670prx;
  16. height: 78rpx;
  17. background: #FFFFFF;
  18. border-radius: 8rpx;
  19. border: 2px solid #00B652;
  20. margin: 0 auto;
  21. text-align: center;
  22. line-height: 78rpx;
  23. }
  24. .second_1_1 {
  25. width: 670rpx;
  26. height: 78rpx;
  27. background: #F4F6F7;
  28. border-radius: 8rpx;
  29. margin: 0 auto;
  30. text-align: center;
  31. line-height: 78rpx;
  32. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/306554
推荐阅读
相关标签
  

闽ICP备14008679号