z-date-select.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. <template>
  2. <view class="mask" @touchmove.stop.prevent="moveHandle" v-if="visible">
  3. <view class="picker-view shadow-2" :animation="animation">
  4. <view class="flex-n fac fjb plr-40 ptb-20">
  5. <view class="cancel" @click="cancel">取消</view>
  6. <view class="ok" @click="ok">确定</view>
  7. </view>
  8. <picker-view class="picker-view-content" :value="timevalue" @change="bindChange">
  9. <picker-view-column>
  10. <view class="item" v-for="(item,index) in yearList" :key="index">{{item}}</view>
  11. </picker-view-column>
  12. <picker-view-column>
  13. <view class="item" v-for="(item,index) in monthList" :key="index">{{item}}</view>
  14. </picker-view-column>
  15. <picker-view-column>
  16. <view class="item" v-for="(item,index) in dayList" :key="index">{{item}}</view>
  17. </picker-view-column>
  18. </picker-view>
  19. </view>
  20. </view>
  21. </template>
  22. <script>
  23. export default{
  24. name:'z-date-select',
  25. props: {
  26. value: String,
  27. visible: Boolean,
  28. startDate: {
  29. type: String,
  30. default: '1900/01/01'
  31. }, //开始时间
  32. endDate: {
  33. type: String,
  34. default: '2100/01/31'
  35. }, //结束时间
  36. },
  37. model: {
  38. prop: 'value',
  39. event: 'input'
  40. },
  41. data() {
  42. return {
  43. timevalue: [0,0,0],
  44. animation: {},
  45. animate: '',
  46. yearList:[],
  47. monthList:[],
  48. dayList:[],
  49. beginMonthList:[],
  50. endMonthList:[],
  51. beginDayList:[],
  52. endDayList:[],
  53. }
  54. },
  55. watch: {
  56. visible(newval, oldval) {
  57. if (newval) {
  58. this.getDefaultDate();
  59. this.animation = this.animate.translateY(500).step({
  60. duration: 0
  61. }).translateY(0).step().export();
  62. }
  63. }
  64. },
  65. mounted() {
  66. this.animate = uni.createAnimation({
  67. duration: 500,
  68. timingFunction: 'ease',
  69. })
  70. },
  71. methods: {
  72. moveHandle() {},
  73. //获取日期默认位置
  74. getDefaultDate(){
  75. var today=this.$DateTime.getDayArea();
  76. console.log(today.date)
  77. var startDate=this.startDate?this.startDate:'1900/01/01',
  78. endDate=this.endDate?this.endDate:'2100/01/31';
  79. var a1=new Date(today.date).getTime()>new Date(startDate).getTime()?true:false;
  80. var a2=new Date(today.date).getTime()<new Date(endDate).getTime()?true:false;
  81. var selectDate=this.value?this.value.split('/'):(a1?(a2?today.date.split('-'):endDate.split('/')):startDate.split('/')),
  82. startYear=Number(startDate.split('/')[0]),
  83. startMonth=Number(startDate.split('/')[1]),
  84. startDay=Number(startDate.split('/')[2]),
  85. endYear=Number(endDate.split('/')[0]),
  86. endMonth=Number(endDate.split('/')[1]),
  87. endDay=Number(endDate.split('/')[2]),
  88. yearList=[],monthList=[],dayList=[],yearSelect=0,monthSelect=0,daySelect=0;
  89. for(var i=startYear;i<=endYear;i++){
  90. yearList.push(i);
  91. if(Number(selectDate[0])==i){
  92. yearSelect=i-startYear;
  93. }
  94. }
  95. if(this.value){ //开始1900/3/5 结束2100/1/1 value 2021-12-15
  96. //显示月
  97. if(startYear!=endYear){
  98. //等于开始年
  99. if(Number(selectDate[0])==startYear){
  100. for(var i=startMonth;i<=12;i++){
  101. monthList.push(i);
  102. if(Number(selectDate[1])==i){
  103. monthSelect=i-startMonth;
  104. }
  105. }
  106. //开始月
  107. if(monthSelect==0){
  108. for(var i=startDay;i<=this.$DateTime.getMonthDayNum(selectDate[0],selectDate[1]);i++){
  109. dayList.push(i)
  110. }
  111. }else{
  112. for(var i=1;i<=this.$DateTime.getMonthDayNum(selectDate[0],selectDate[1]);i++){
  113. dayList.push(i)
  114. }
  115. }
  116. }else if(Number(selectDate[0])==endYear){//等于结束年
  117. for(var i=1;i<=endMonth;i++){
  118. monthList.push(i);
  119. if(Number(selectDate[1])==i){
  120. monthSelect=i-1;
  121. }
  122. }
  123. if(monthSelect==monthList.length-1){
  124. for(var i=1;i<=endDay;i++){
  125. dayList.push(i)
  126. }
  127. }else{
  128. for(var i=1;i<=this.$DateTime.getMonthDayNum(selectDate[0],selectDate[1]);i++){
  129. dayList.push(i)
  130. }
  131. }
  132. }else{
  133. for(var i=1;i<=12;i++){
  134. monthList.push(i);
  135. if(Number(selectDate[1])==i){
  136. monthSelect=i-1;
  137. }
  138. }
  139. for(var i=1;i<=this.$DateTime.getMonthDayNum(selectDate[0],selectDate[1]);i++){
  140. dayList.push(i)
  141. }
  142. }
  143. }else{
  144. for(var i=startMonth;i<=endMonth;i++){
  145. monthList.push(i);
  146. if(Number(selectDate[1])==i){
  147. monthSelect=i-startMonth;
  148. }
  149. }
  150. for(var i=startDay;i<=endDay;i++){
  151. dayList.push(i)
  152. }
  153. }
  154. }else{
  155. if(startYear==endYear){
  156. for(var i=startMonth;i<=endMonth;i++){
  157. monthList.push(i);
  158. if(Number(selectDate[1])==i){
  159. monthSelect=i-startMonth;
  160. }
  161. }
  162. //获取日
  163. if(monthList.length==1){
  164. //显示日
  165. for(var i=startDay;i<=endDate;i++){
  166. dayList.push(i)
  167. }
  168. }else{
  169. if(monthSelect==0){
  170. for(var i=startDay;i<=this.$DateTime.getMonthDayNum(yearList[yearSelect],monthList[monthSelect]);i++){
  171. dayList.push(i)
  172. }
  173. }else if(monthSelect==(monthList.length-1)){
  174. for(var i=1;i<=endDay;i++){
  175. dayList.push(i)
  176. }
  177. }else{
  178. for(var i=1;i<=this.$DateTime.getMonthDayNum(yearList[yearSelect],monthList[monthSelect]);i++){
  179. dayList.push(i)
  180. }
  181. }
  182. }
  183. }else{
  184. if(Number(selectDate[0])==startYear){
  185. for(var i=startMonth;i<=12;i++){
  186. monthList.push(i);
  187. if(Number(selectDate[1])==i){
  188. monthSelect=i-startMonth;
  189. }
  190. }
  191. if(monthSelect==0){
  192. for(var i=startDay;i<=this.$DateTime.getMonthDayNum(yearList[yearSelect],monthList[monthSelect]);i++){
  193. dayList.push(i)
  194. }
  195. }else{
  196. for(var i=1;i<=this.$DateTime.getMonthDayNum(yearList[yearSelect],monthList[monthSelect]);i++){
  197. dayList.push(i)
  198. }
  199. }
  200. }
  201. else if(Number(selectDate[0])==endYear){
  202. for(var i=1;i<=endMonth;i++){
  203. monthList.push(i);
  204. if(Number(selectDate[1])==i){
  205. monthSelect=i-1;
  206. }
  207. }
  208. if(monthSelect==(monthList.length-1)){
  209. for(var i=1;i<=endDay;i++){
  210. dayList.push(i)
  211. }
  212. }else{
  213. for(var i=1;i<=this.$DateTime.getMonthDayNum(yearList[yearSelect],monthList[monthSelect]);i++){
  214. dayList.push(i)
  215. }
  216. }
  217. }else{
  218. for(var i=1;i<=12;i++){
  219. monthList.push(i);
  220. if(Number(selectDate[1])==i){
  221. monthSelect=i-1;
  222. }
  223. }
  224. for(var i=1;i<=this.$DateTime.getMonthDayNum(yearList[yearSelect],monthList[monthSelect]);i++){
  225. dayList.push(i)
  226. }
  227. }
  228. }
  229. }
  230. for(var i=0;i<dayList.length;i++){
  231. if(dayList[i]==selectDate[2]){
  232. daySelect=i;
  233. }
  234. }
  235. this.timevalue=[].concat([yearSelect,monthSelect,daySelect])
  236. console.log(yearSelect,monthSelect,daySelect)
  237. this.yearList=yearList;
  238. this.monthList=monthList;
  239. this.dayList=dayList;
  240. },
  241. //根据 第几年判断是不是起始年,和末尾年
  242. getMonth(yearNum){
  243. var startDate=this.startDate?this.startDate:'1900/01/01',
  244. endDate=this.endDate?this.endDate:'2100/01/31';
  245. var monthStart=Number(startDate.split('/')[1]),
  246. monthEnd=Number(endDate.split('/')[1]),
  247. monthList=[];
  248. if(yearNum==0&&yearNum!=this.yearList.length-1){//最小年最初月
  249. for(var i=monthStart;i<=12;i++){
  250. monthList.push(i)
  251. }
  252. }else if(yearNum!=0&&yearNum==this.yearList.length-1){//最大年最末月
  253. for(var i=1;i<=monthEnd;i++){
  254. monthList.push(i)
  255. }
  256. }else if(yearNum==0&&yearNum==this.yearList.length-1){//起始末尾是同一年
  257. for(var i=monthStart;i<=monthEnd;i++){
  258. monthList.push(i)
  259. }
  260. }else{
  261. for(var i=1;i<=12;i++){
  262. monthList.push(i)
  263. }
  264. }
  265. this.monthList=monthList;
  266. this.getDay(yearNum,0,0);
  267. },
  268. getDay(yearNum,monthNum,dayNum){
  269. var startDate=this.startDate?this.startDate:'1900/01/01',
  270. endDate=this.endDate?this.endDate:'2100/01/31';
  271. var dayStart=Number(startDate.split('/')[2]),
  272. dayEnd=Number(endDate.split('/')[2]),
  273. dayList=[];
  274. console.log('dayEnd',dayEnd)
  275. if(this.yearList.length!=1){
  276. if(this.monthList.length!=1){
  277. if(yearNum==0&&monthNum==0){
  278. for(var i=dayStart;i<=this.$DateTime.getMonthDayNum(this.yearList[yearNum],this.monthList[monthNum]);i++){
  279. dayList.push(i)
  280. }
  281. }else if(yearNum==(this.yearList.length-1)&&monthNum==(this.monthList.length-1)){
  282. for(var i=1;i<=dayEnd;i++){
  283. dayList.push(i)
  284. }
  285. }else{
  286. for(var i=1;i<=this.$DateTime.getMonthDayNum(this.yearList[yearNum],this.monthList[monthNum]);i++){
  287. dayList.push(i)
  288. }
  289. }
  290. }else{
  291. for(var i=dayStart;i<=this.$DateTime.getMonthDayNum(this.yearList[yearNum],this.monthList[monthNum]);i++){
  292. dayList.push(i)
  293. }
  294. }
  295. }else{
  296. if(this.monthList.length!=1){
  297. if(monthNum==0){
  298. for(var i=dayStart;i<=this.$DateTime.getMonthDayNum(this.yearList[yearNum],this.monthList[monthNum]);i++){
  299. dayList.push(i)
  300. }
  301. }else if(monthNum==(this.monthList.length-1)){
  302. for(var i=1;i<=dayEnd;i++){
  303. dayList.push(i)
  304. }
  305. }else{
  306. for(var i=1;i<=this.$DateTime.getMonthDayNum(this.yearList[yearNum],this.monthList[monthNum]);i++){
  307. dayList.push(i)
  308. }
  309. }
  310. }else{
  311. for(var i=dayStart;i<=dayEnd;i++){
  312. dayList.push(i)
  313. }
  314. }
  315. }
  316. this.dayList=dayList;
  317. console.log(dayList.length)
  318. if(yearNum!=this.timevalue[0]){
  319. this.timevalue=[yearNum,0,0];
  320. }
  321. if(monthNum!=this.timevalue[1]){
  322. this.timevalue=[yearNum,monthNum,0];
  323. }else{
  324. if(dayNum!=this.timevalue[2]){
  325. this.timevalue=[yearNum,monthNum,dayNum];
  326. }
  327. }
  328. console.log(this.timevalue)
  329. },
  330. bindChange(e) {
  331. console.log(e)
  332. if(e.detail.value[0]!=this.timevalue[0]){
  333. console.log(e.detail.value[0],this.timevalue[0],1)
  334. this.getMonth(e.detail.value[0]);
  335. }
  336. else{
  337. console.log(e.detail.value[1],this.timevalue[1],2)
  338. this.getDay(e.detail.value[0],e.detail.value[1],e.detail.value[2]);
  339. }
  340. },
  341. ok() {
  342. this.$emit('input',this.yearList[this.timevalue[0]]+'/'+this.monthList[this.timevalue[1]]+'/'+this.dayList[this.timevalue[2]])
  343. // this.$emit('input',this.timeList[this.oneId].hours+':'+this.timeList[this.oneId].minutesList[this.secondId])
  344. this.$emit('update:visible', false);
  345. this.$emit('ok');
  346. },
  347. cancel() {
  348. this.$emit('cancel');
  349. this.$emit('update:visible', false)
  350. }
  351. }
  352. }
  353. </script>
  354. <style scoped lang="scss">
  355. .mask {
  356. position: fixed;
  357. top: 0;
  358. left: 0;
  359. z-index: 999;
  360. width: 100%;
  361. height: 100vh;
  362. background: rgba($color: #000000, $alpha: 0.3);
  363. }
  364. .picker-view {
  365. position: absolute;
  366. bottom: 0;
  367. left: 0;
  368. width: 100%;
  369. height: 476rpx;
  370. border-top-left-radius: 40rpx;
  371. border-top-right-radius: 40rpx;
  372. overflow: hidden;
  373. background-color: white;
  374. z-index: 1000;
  375. .cancel {
  376. font-size: 38rpx;
  377. color: #ccc;
  378. }
  379. .ok {
  380. font-size: 38rpx;
  381. color: #F0AD4E;
  382. }
  383. .picker-view-content {
  384. height: 350rpx;
  385. }
  386. .disabled {
  387. background: #eeeeee;
  388. color: white;
  389. }
  390. .item {
  391. text-align: center;
  392. font-size: 32rpx;
  393. line-height: 64rpx;
  394. }
  395. }
  396. </style>