gui-datetime-bt-base.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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="gui-picker-item"
  11. :style="indicatorStyle"
  12. v-for="(item, index) in sDate[0]"
  13. :key="index">
  14. <text
  15. class="gui-picker-item"
  16. :style="indicatorStyle">{{item}}{{units[0]}}</text>
  17. </view>
  18. </picker-view-column>
  19. <picker-view-column>
  20. <view
  21. class="gui-picker-item"
  22. :style="indicatorStyle"
  23. v-for="(item, index) in sDate[1]"
  24. :key="index">
  25. <text
  26. class="gui-picker-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="gui-picker-item"
  34. :style="indicatorStyle"
  35. v-for="(item, index) in sDate[2]"
  36. :key="index">
  37. <text
  38. class="gui-picker-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="gui-picker-item"
  46. :style="indicatorStyle"
  47. v-for="(item, index) in sDate[3]"
  48. :key="index">
  49. <text
  50. class="gui-picker-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="gui-picker-item"
  58. :style="indicatorStyle"
  59. v-for="(item, index) in sDate[4]"
  60. :key="index">
  61. <text
  62. class="gui-picker-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="gui-picker-item"
  70. :style="indicatorStyle"
  71. v-for="(item, index) in sDate[5]"
  72. :key="index">
  73. <text
  74. class="gui-picker-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(){
  92. return new Array('年','月','日','时','分','秒');
  93. }},
  94. height : { type : String, default : '300rpx' },
  95. indicatorStyle : { type : String, default : 'height:36px; line-heiht:36px;'}
  96. },
  97. data() {
  98. return {
  99. defaultVal : [],
  100. sDate:[[],[],[],[],[],[]]
  101. }
  102. },
  103. created() {
  104. this.init();
  105. },
  106. methods: {
  107. now : function () {
  108. var date = new Date();
  109. var y = date.getFullYear();
  110. var m = date.getMonth() + 1;
  111. m = m < 10 ? ('0' + m) : m;
  112. var d = date.getDate();
  113. d = d < 10 ? ('0' + d) : d;
  114. var h = date.getHours();
  115. h = h < 10 ? ('0' + h) : h;
  116. var minute = date.getMinutes();
  117. var second = date.getSeconds();
  118. minute = minute < 10 ? ('0' + minute) : minute;
  119. second = second < 10 ? ('0' + second) : second;
  120. return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;
  121. },
  122. arrayIndexOf : function(arr, needFind){
  123. var index = -1;
  124. for(let i = 0; i < arr.length; i++){if(arr[i] == needFind){index = i; return i;}}
  125. return index;
  126. },
  127. setValue : function (val) {
  128. if(val == ''){val = this.now();}
  129. var reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
  130. var res = val.match(reg);
  131. if(res == null){
  132. reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/;
  133. res = val.match(reg);
  134. if(res == null){
  135. this.setValue(this.now());
  136. return ;
  137. }
  138. res[4] = '00';
  139. res[5] = '00';
  140. res[6] = '00';
  141. }
  142. this.setDefaults([res[1],res[2],res[3],res[4],res[5],res[6]]);
  143. },
  144. setDefaults : function (res) {
  145. this.defaultVal = [];
  146. for(let i = 0; i < res.length; i++){
  147. var index = this.arrayIndexOf(this.sDate[i], res[i]);
  148. if(index == -1){index = 0;}
  149. this.defaultVal.push(index);
  150. }
  151. this.$nextTick(()=>{
  152. setTimeout(()=>{
  153. this.changeBase(this.defaultVal);
  154. }, 300);
  155. });
  156. },
  157. // 初始化组件
  158. init:function(){
  159. if(this.endYear < this.startYear){
  160. this.endYear = this.startYear + 10;
  161. }
  162. var years = new Array();
  163. for(let i = this.startYear; i <= this.endYear; i++){
  164. years.push(i);
  165. }
  166. var months = new Array();
  167. for(let i = 1; i <= 12; i++){
  168. if(i < 10){
  169. months.push('0'+i);
  170. }else{
  171. months.push(i);
  172. }
  173. }
  174. var days = new Array();
  175. for(let i = 1; i <= 31; i++){
  176. if(i < 10){
  177. days.push('0'+i);
  178. }else{
  179. days.push(i);
  180. }
  181. }
  182. var hours = new Array();
  183. for(let i = 0; i < 24; i++){
  184. if(i < 10){
  185. hours.push('0'+i);
  186. }else{
  187. hours.push(i);
  188. }
  189. }
  190. var minutes = new Array();
  191. var seconds = new Array();
  192. for(let i = 0; i < 60; i++){
  193. if(i < 10){
  194. minutes.push('0'+i); seconds.push('0'+i);
  195. }else{
  196. minutes.push(i);
  197. seconds.push(i);
  198. }
  199. }
  200. this.sDate = [years, months, days, hours, minutes, seconds];
  201. this.$nextTick(()=>{
  202. this.setValue(this.value);
  203. })
  204. },
  205. change : function (res) {
  206. this.changeBase(res.detail.value);
  207. },
  208. changeBase:function(res){
  209. var date = new Date(this.sDate[0][res[0]], this.sDate[1][res[1]], 0);
  210. var days = date.getDate();
  211. var daysOut = new Array();
  212. for(let i = 1; i <= days; i++){
  213. if(i < 10){
  214. daysOut.push('0'+i);
  215. }else{
  216. daysOut.push(i);
  217. }
  218. }
  219. this.sDate.splice(2, 1, daysOut);
  220. if(res[2] + 1 > days){
  221. res[2] = days - 1;
  222. }
  223. this.defaultVal = res;
  224. if(this.isTime){
  225. var resdata = new Array(this.sDate[0][this.defaultVal[0]],
  226. this.sDate[1][this.defaultVal[1]],
  227. this.sDate[2][this.defaultVal[2]],
  228. this.sDate[3][this.defaultVal[3]],
  229. this.sDate[4][this.defaultVal[4]],
  230. this.sDate[5][this.defaultVal[5]]);
  231. }else{
  232. var resdata = new Array(this.sDate[0][this.defaultVal[0]],
  233. this.sDate[1][this.defaultVal[1]],
  234. this.sDate[2][this.defaultVal[2]])
  235. }
  236. this.$emit('change', resdata);
  237. },
  238. confirm:function () {
  239. if(this.isTime){
  240. var res = new Array(this.sDate[0][this.defaultVal[0]],
  241. this.sDate[1][this.defaultVal[1]],
  242. this.sDate[2][this.defaultVal[2]],
  243. this.sDate[3][this.defaultVal[3]],
  244. this.sDate[4][this.defaultVal[4]],
  245. this.sDate[5][this.defaultVal[5]]);
  246. }else{
  247. var res = new Array(this.sDate[0][this.defaultVal[0]],
  248. this.sDate[1][this.defaultVal[1]],
  249. this.sDate[2][this.defaultVal[2]])
  250. }
  251. this.$emit('confirm', res);
  252. }
  253. },
  254. emits : ['change', 'confirm']
  255. }
  256. </script>
  257. <style scoped>
  258. .graceDateTime-main{width:750rpx; height:300rpx;}
  259. </style>