gui-datetime-bt-base.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <template>
  2. <picker-view
  3. :style="{height:height}"
  4. :indicator-style="indicatorStyle"
  5. class="graceDateTime-main"
  6. :value="defaultVal"
  7. @change="change">
  8. <picker-view-column>
  9. <view
  10. class="graceDateTime-item"
  11. :style="indicatorStyle"
  12. v-for="(item, index) in sDate[0]"
  13. :key="index">
  14. <text
  15. class="graceDateTime-item"
  16. :style="indicatorStyle">{{item}}{{units[0]}}</text>
  17. </view>
  18. </picker-view-column>
  19. <picker-view-column>
  20. <view
  21. class="graceDateTime-item"
  22. :style="indicatorStyle"
  23. v-for="(item, index) in sDate[1]"
  24. :key="index">
  25. <text
  26. class="graceDateTime-item"
  27. :style="indicatorStyle">{{item}}{{units[1]}}</text>
  28. </view>
  29. </picker-view-column>
  30. <picker-view-column
  31. v-if="isDay">
  32. <view
  33. class="graceDateTime-item"
  34. :style="indicatorStyle"
  35. v-for="(item, index) in sDate[2]"
  36. :key="index">
  37. <text
  38. class="graceDateTime-item"
  39. :style="indicatorStyle">{{item}}{{units[2]}}</text>
  40. </view>
  41. </picker-view-column>
  42. <picker-view-column
  43. v-if="isTime">
  44. <view
  45. class="graceDateTime-item"
  46. :style="indicatorStyle"
  47. v-for="(item, index) in sDate[3]"
  48. :key="index">
  49. <text
  50. class="graceDateTime-item"
  51. :style="indicatorStyle">{{item}}{{units[3]}}</text>
  52. </view>
  53. </picker-view-column>
  54. <picker-view-column
  55. v-if="isTime && isMinute">
  56. <view
  57. class="graceDateTime-item"
  58. :style="indicatorStyle"
  59. v-for="(item, index) in sDate[4]"
  60. :key="index">
  61. <text
  62. class="graceDateTime-item"
  63. :style="indicatorStyle">{{item}}{{units[4]}}</text>
  64. </view>
  65. </picker-view-column>
  66. <picker-view-column
  67. v-if="isTime && isMinute && isSecond">
  68. <view
  69. class="graceDateTime-item"
  70. :style="indicatorStyle"
  71. v-for="(item, index) in sDate[5]"
  72. :key="index">
  73. <text
  74. class="graceDateTime-item"
  75. :style="indicatorStyle">{{item}}{{units[5]}}</text>
  76. </view>
  77. </picker-view-column>
  78. </picker-view>
  79. </template>
  80. <script>
  81. export default {
  82. name : "gui-datetime-bt-base",
  83. props : {
  84. value : { type : String , default:''},
  85. isMinute : { type : Boolean, default : true},
  86. isTime : { type : Boolean, default : true},
  87. isSecond : { type : Boolean, default : true},
  88. isDay : { type : Boolean, default : true },
  89. startYear : { type : Number, default : 1980},
  90. endYear : { type : Number, default : 2050},
  91. units : { type : Array , default:function(){return new Array('年','月','日','时','分','秒')}},
  92. height : { type : String, default : '300rpx' },
  93. indicatorStyle : { type : String, default : 'height:36px; line-heiht:36px;'}
  94. },
  95. data() {
  96. return {
  97. defaultVal : [0,0,0,0,0,0],
  98. sDate:[[],[],[],[],[],[]]
  99. }
  100. },
  101. created() {this.init();},
  102. methods: {
  103. now : function () {
  104. var date = new Date();
  105. var y = date.getFullYear();
  106. var m = date.getMonth() + 1;
  107. m = m < 10 ? ('0' + m) : m;
  108. var d = date.getDate();
  109. d = d < 10 ? ('0' + d) : d;
  110. var h = date.getHours();
  111. h = h < 10 ? ('0' + h) : h;
  112. var minute = date.getMinutes();
  113. var second = date.getSeconds();
  114. minute = minute < 10 ? ('0' + minute) : minute;
  115. second = second < 10 ? ('0' + second) : second;
  116. return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;
  117. },
  118. arrayIndexOf : function(arr, needFind){
  119. var index = -1;
  120. for(let i = 0; i < arr.length; i++){if(arr[i] == needFind){index = i; return i;}}
  121. return index;
  122. },
  123. setValue : function (val) {
  124. if(val == ''){val = this.now();}
  125. var reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
  126. var res = val.match(reg);
  127. if(res == null){
  128. reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/;
  129. res = val.match(reg);
  130. if(res == null){
  131. this.setValue(this.now());
  132. return ;
  133. }
  134. res[4] = '00';
  135. res[5] = '00';
  136. res[6] = '00';
  137. }
  138. this.setDefaults([res[1],res[2],res[3],res[4],res[5],res[6]]);
  139. },
  140. setDefaults : function (res) {
  141. for(let i = 0; i < res.length; i++){
  142. var index = this.arrayIndexOf(this.sDate[i], res[i]);
  143. if(index == -1){index = 0;}
  144. this.defaultVal.splice(i, 1, index);
  145. }
  146. this.changeBase(this.defaultVal);
  147. },
  148. // 初始化组件
  149. init:function(){
  150. if(this.endYear < this.startYear){this.endYear = this.startYear + 10;}
  151. var years = new Array();
  152. for(let i = this.startYear; i <= this.endYear; i++){years.push(i);}
  153. var months = new Array();
  154. for(let i = 1; i <= 12; i++){if(i < 10){months.push('0'+i);}else{months.push(i);}}
  155. var days = new Array();
  156. for(let i = 1; i <= 31; i++){if(i < 10){days.push('0'+i);}else{days.push(i);}}
  157. var hours = new Array();
  158. for(let i = 0; i < 24; i++){if(i < 10){hours.push('0'+i);}else{hours.push(i);}}
  159. var minutes = new Array();
  160. var seconds = new Array();
  161. for(let i = 0; i < 60; i++){
  162. if(i < 10){minutes.push('0'+i); seconds.push('0'+i);}else{minutes.push(i); seconds.push(i);}
  163. }
  164. this.sDate = [years, months, days, hours, minutes, seconds];
  165. this.$nextTick(()=>{setTimeout(()=>{ this.setValue(this.value);},800);});
  166. },
  167. change : function (res) {
  168. this.changeBase(res.detail.value);
  169. },
  170. changeBase:function(res){
  171. var date = new Date(this.sDate[0][res[0]], this.sDate[1][res[1]], 0);
  172. var days = date.getDate();
  173. var daysOut = new Array();
  174. for(let i = 1; i <= days; i++){if(i < 10){daysOut.push('0'+i);}else{daysOut.push(i);}}
  175. this.sDate.splice(2, 1, daysOut);
  176. if(res[2] + 1 > days){res[2] = days - 1;}
  177. this.defaultVal = res;
  178. if(this.isTime){
  179. var resdata = new Array(this.sDate[0][this.defaultVal[0]],
  180. this.sDate[1][this.defaultVal[1]],
  181. this.sDate[2][this.defaultVal[2]],
  182. this.sDate[3][this.defaultVal[3]],
  183. this.sDate[4][this.defaultVal[4]],
  184. this.sDate[5][this.defaultVal[5]]);
  185. }else{
  186. var resdata = new Array(this.sDate[0][this.defaultVal[0]],
  187. this.sDate[1][this.defaultVal[1]],
  188. this.sDate[2][this.defaultVal[2]])
  189. }
  190. this.$emit('change', resdata);
  191. },
  192. confirm:function () {
  193. if(this.isTime){
  194. var res = new Array(this.sDate[0][this.defaultVal[0]],
  195. this.sDate[1][this.defaultVal[1]],
  196. this.sDate[2][this.defaultVal[2]],
  197. this.sDate[3][this.defaultVal[3]],
  198. this.sDate[4][this.defaultVal[4]],
  199. this.sDate[5][this.defaultVal[5]]);
  200. }else{
  201. var res = new Array(this.sDate[0][this.defaultVal[0]],
  202. this.sDate[1][this.defaultVal[1]],
  203. this.sDate[2][this.defaultVal[2]])
  204. }
  205. this.$emit('confirm', res);
  206. }
  207. }
  208. }
  209. </script>
  210. <style scoped>
  211. .graceDateTime-main{width:750rpx; height:300rpx; color:#323232;}
  212. .graceDateTime-item{font-size:26rpx; height:36px; line-height:36px; text-align:center; overflow:hidden;}
  213. /* #ifndef APP-NVUE */
  214. .graceDateTime-item{display:block;}
  215. /* #endif */
  216. </style>