datetime.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <template>
  2. <view>
  3. <view @click="showDiv" class="flex alcenter">
  4. <text class="ft16 cl-manage">{{value == 0 ? '请选择' : value}}</text>
  5. <text class="iconfont iconicon_arrow_small ml5 ft14 cl-manage"></text>
  6. </view>
  7. <view v-show="show" class="selecttime-modal">
  8. <view class="modal-bg"></view>
  9. <view class="modal-box animated fast" :class="show ? 'slideInUp' : 'slideOutDown'">
  10. <view class="modal-main">
  11. <view class="closed">
  12. <text @click="closed()" class="iconfont ft20 cl-notice iconbtn_close"></text>
  13. </view>
  14. <view class="lh20 ft16 cl-main ftw600 text-center">选择时间</view>
  15. <view class="mt40">
  16. <view class="flex">
  17. <view class="col2 flex center">
  18. <view class="time-type" @click="changeType(0)" :class="selectType == 0 ? 'on' :''">选择日期</view>
  19. </view>
  20. <view class="col2 flex center">
  21. <view class="time-type" @click="changeType(1)" :class="selectType == 1 ? 'on' :''">选择时分</view>
  22. </view>
  23. </view>
  24. <view v-if="selectType == 0 && show == true " class="pd16_15">
  25. <picker-view class="picker-view" indicator-style="height:50px" :value="[selectVal[0],selectVal[1],selectVal[2]]"
  26. @change="bindChange">
  27. <picker-view-column>
  28. <view class="item text-center" v-for="(item,index) in years" :key="index">{{item}}年</view>
  29. </picker-view-column>
  30. <picker-view-column>
  31. <view class="item text-center" v-for="(item,index) in month" :key="index">{{item}}月</view>
  32. </picker-view-column>
  33. <picker-view-column>
  34. <view class="item text-center" v-for="(item,index) in days" :key="index">{{item}}日</view>
  35. </picker-view-column>
  36. </picker-view>
  37. </view>
  38. <view v-if="selectType == 1 && show == true" class="pd16_15">
  39. <picker-view class="picker-view" indicator-style="height:50px" :value="[selectVal[3],selectVal[4]]" @change="bindChange2">
  40. <picker-view-column>
  41. <view class="item text-center" v-for="(item,index) in hours" :key="index">{{item}}时</view>
  42. </picker-view-column>
  43. <picker-view-column>
  44. <view class="item text-center" v-for="(item,index) in mins" :key="index">{{item}}分</view>
  45. </picker-view-column>
  46. </picker-view>
  47. </view>
  48. <view class="pd16_15">
  49. <button @click="submitYes" class="btn-manage">确定选择</button>
  50. </view>
  51. </view>
  52. </view>
  53. </view>
  54. </view>
  55. </view>
  56. </template>
  57. <script>
  58. import helper from '../../static/js/helper.js';
  59. export default {
  60. props: {
  61. value: {
  62. type: String,
  63. default: ''
  64. },
  65. },
  66. data() {
  67. let years = new Array;
  68. for (var i = 2000; i <= 2030; i++) {
  69. years.push(i);
  70. }
  71. let month = new Array;
  72. for (var i = 1; i <= 12; i++) {
  73. var m = i < 10 ? '0' + i : i;
  74. month.push(m);
  75. }
  76. let days = this.makeDays([0, 0]);
  77. let hours = new Array;
  78. for (var i = 0; i <= 23; i++) {
  79. var h = i < 10 ? '0' + i : i;
  80. hours.push(h);
  81. }
  82. let mins = new Array;
  83. for (var i = 0; i <= 59; i++) {
  84. var min = i < 10 ? '0' + i : i;
  85. mins.push(min);
  86. }
  87. return {
  88. selectType: 0,
  89. mydateValue: [0, 0, 0, 0, 0],
  90. years: years,
  91. month: month,
  92. days: days,
  93. hours: hours,
  94. mins: mins,
  95. show: false,
  96. }
  97. },
  98. computed: {
  99. getValue() {
  100. let value = this.value;
  101. if (value == '' || value == 0) {
  102. let today = helper.getTimeArr();
  103. value = today.y + '-' + today.m + '-' + today.d + ' ' + today.h + ':' + today.i;
  104. }
  105. let v = value.replace(/[-|:]/g, ' ');
  106. let val = v.split(' ');
  107. return val;
  108. },
  109. selectVal() {
  110. let value = this.getValue;
  111. let month = this.month;
  112. let days = this.days;
  113. let hours = this.hours;
  114. let mins = this.mins;
  115. let res = [0, 0, 0, 0, 0];
  116. for (var a in this.years) {
  117. if (this.years[a] == value[0]) {
  118. res[0] = parseInt(a);
  119. break;
  120. }
  121. }
  122. for (var a in month) {
  123. if (month[a] == value[1]) {
  124. res[1] = parseInt(a);
  125. break;
  126. }
  127. }
  128. for (var a in days) {
  129. if (days[a] == value[2]) {
  130. res[2] = parseInt(a);
  131. break;
  132. }
  133. }
  134. for (var a in hours) {
  135. if (hours[a] == value[3]) {
  136. res[3] = parseInt(a);
  137. break;
  138. }
  139. }
  140. for (var a in mins) {
  141. if (mins[a] == value[4]) {
  142. res[4] = parseInt(a);
  143. break;
  144. }
  145. }
  146. return res;
  147. },
  148. },
  149. methods: {
  150. showDiv() {
  151. this.show = true;
  152. },
  153. makeDays(value) {
  154. let years = value[0];
  155. let month = value[1];
  156. let dmax = 31;
  157. if ((years / 4 == 0) && month == '02') {
  158. if ((years / 100 == 0) && (years % 400 !== 0)) {
  159. dmax = 28;
  160. } else {
  161. dmax = 29;
  162. }
  163. } else {
  164. if (month == '04' || month == '06' || month == '09' || month == '11') {
  165. dmax = 30;
  166. } else if (month == '02') {
  167. dmax = 28;
  168. }
  169. }
  170. let days = new Array;
  171. for (var i = 1; i <= dmax; i++) {
  172. var d = i < 10 ? '0' + i : i;
  173. days.push(d);
  174. }
  175. return days;
  176. },
  177. makeDays2(selectVal) {
  178. let values = [this.years[selectVal[0]], this.month[selectVal[1]]];
  179. return this.makeDays(values);
  180. },
  181. bindChange(e) {
  182. let values = e.detail.value;
  183. this.days = this.makeDays2(values);
  184. this.mydateValue[0] = values[0];
  185. this.mydateValue[1] = values[1];
  186. this.mydateValue[2] = values[2];
  187. },
  188. bindChange2(e) {
  189. let values = e.detail.value;
  190. this.mydateValue[3] = values[0];
  191. this.mydateValue[4] = values[1];
  192. },
  193. submitYes() {
  194. for (var a in this.mydateValue) {
  195. if (this.mydateValue[a] == 0) {
  196. this.mydateValue[a] = this.selectVal[a];
  197. }
  198. }
  199. let date = this.years[this.mydateValue[0]] + '-' +
  200. this.month[this.mydateValue[1]] + '-' +
  201. this.days[this.mydateValue[2]] + ' ' +
  202. this.hours[this.mydateValue[3]] + ':' +
  203. this.mins[this.mydateValue[4]];
  204. if (date == '2000-01-00 00:00') {
  205. this.$emit('input', this.value);
  206. } else {
  207. this.$emit('input', date);
  208. }
  209. this.selectType = 0;
  210. this.show = false;
  211. },
  212. closedAct() {
  213. this.show = false;
  214. },
  215. changeType(type) {
  216. this.selectType = type;
  217. },
  218. }
  219. }
  220. </script>
  221. <style>
  222. .selecttime-modal{
  223. position: relative;
  224. z-index: 400;
  225. }
  226. .selecttime-modal .modal-bg{
  227. position: fixed;
  228. z-index: 400;
  229. left: 0;
  230. top: 0;
  231. width: 100%;
  232. height: 100vh;
  233. background: rgba(0,0,0,.5);
  234. }
  235. .selecttime-modal .modal-box{
  236. position: fixed;
  237. z-index: 401;
  238. background:#FFFFFF;
  239. left: 0;
  240. bottom: 0;
  241. width: 100%;
  242. padding-bottom:0rpx;
  243. padding-bottom:constant(safe-area-inset-bottom);
  244. padding-bottom:env(safe-area-inset-bottom);
  245. border-radius:32rpx 32rpx 0rpx 0rpx;
  246. }
  247. .selecttime-modal .modal-main{
  248. position: relative;
  249. height: auto;
  250. overflow: hidden;
  251. padding-top: 64rpx;
  252. }
  253. .selecttime-modal .modal-main .closed{
  254. position: absolute;
  255. right: 40rpx;
  256. top: 40rpx;
  257. }
  258. .time-type {
  259. height: 66rpx;
  260. color: #333333;
  261. font-size: 36rpx;
  262. font-weight: 600;
  263. border-bottom: 6rpx solid #FFFFFF;
  264. }
  265. .time-type.on {
  266. border-color: #5E40FF;
  267. color: #5E40FF;
  268. }
  269. </style>