1 简介
vant虽然提供了日期时间选择器,但是非常不方便,需要写很多东西才能实现一个正常的日期时间选择,所以在这个基础上做一个封装
2 组件代码my-datepicker
1)wxml
<!--components/my-datepicker.wxml-->
<view>
<view class="search-kk" bindtap='openPicker'>{{value}}</view>
</view>
<van-popup
show="{{ show }}"
position="bottom"
custom-style="height: 60%;"
bind:close="onCancel">
<van-datetime-picker
type="{{datetype}}"
value="{{currentDate}}"
min-date="{{minDate}}"
max-date="{{maxDate}}"
bind:confirm="onConfirm"
bind:cancel="onCancel"
/>
</van-popup>
2)js
// components/my-datepicker.js
const dateutils = require('../../utils/dateUtil');
Component({
/**
* 组件的属性列表
*/
properties: {
datetype:{
type:String,
value:'datetime'
},
minDate:{
type:Date,
value:new Date((new Date().getFullYear() - 2), 10, 1).getTime()
},
maxDate:{
type:Date,
value:new Date((new Date().getFullYear() + 2), 10, 1).getTime()
},
currentDate:{
type:Date,
value:new Date().getTime()
},
formatLength:{
type:Number,
value:6
}
},
// 监听传入的变量,当传入的值发生变化时,触发方法,对传入的list加上下标赋值给listAct
observers: {
'currentDate': function (val) {
var da = dateutils.formatTimeStampToStByLength(val,this.properties.formatLength)
this.setData({
value:da
})
},
'formatLength': function (val) {
var da = dateutils.formatTimeStampToStByLength(this.properties.currentDate,val)
this.setData({
value:da
})
}
},
/**
* 组件的初始数据
*/
data: {
show:false,
value:dateutils.formatTimeStampToStByLength(new Date().getTime(),6) // 默认格式化长度6,和formatLength一致
},
/**
* 组件的方法列表
*/
lifetimes: {
attached: function() {
},
detached: function() {
},
},
methods: {
openPicker(){
this.setData({
show:true
})
},
onCancel(){
this.setData({
show:false
})
},
onConfirm(event){
var value = dateutils.formatTimeStamp(event.detail)
if(this.properties.datetype == 'datetime'){
value = dateutils.formatTimeStampToSt(event.detail)
}
var formatdate = dateutils.formatTimeStampToStByLength(event.detail,this.properties.formatLength)
this.setData({
show: false,
'value': value,
})
var datevalue = {
'timestamp':event.detail,
'formatdate':formatdate
}
this.triggerEvent('getdatevalue',{value:datevalue})
}
}
})
3)json
{
"component": true,
"usingComponents": {
"van-picker": "@vant/weapp/picker/index",
"van-datetime-picker": "@vant/weapp/datetime-picker/index",
"van-field": "@vant/weapp/field/index",
"van-popup": "@vant/weapp/popup/index"
}
}
日期工具类
function formatTimeStampToSt(timestamp) {
var date = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1):date.getMonth()+1) + '-';
var D = (date.getDate()< 10 ? '0'+date.getDate():date.getDate())+ ' ';
var h = (date.getHours() < 10 ? '0'+date.getHours():date.getHours())+ ':';
var m = (date.getMinutes() < 10 ? '0'+date.getMinutes():date.getMinutes()) + ':';
var s = date.getSeconds() < 10 ? '0'+date.getSeconds():date.getSeconds();
return Y+M+D+h+m+s;
}
function formatTimeStampToStByLength(timestamp,i) {
var date = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
var Y = date.getFullYear();
var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1):date.getMonth()+1) ;
var D = (date.getDate()< 10 ? '0'+date.getDate():date.getDate());
var h = (date.getHours() < 10 ? '0'+date.getHours():date.getHours());
var m = (date.getMinutes() < 10 ? '0'+date.getMinutes():date.getMinutes());
var s = date.getSeconds() < 10 ? '0'+date.getSeconds():date.getSeconds();
var st = Y
if(i > 1){
st = st + "-" + M
}
if(i > 2){
st = st + '-' + D
}
if(i > 3){
st = st + ' ' + h
}
if(i > 4){
st = st + ':' + m
}
if(i > 5){
st = st + ':' + s
}
return st;
}
function formatTimeStamp(timestamp) {
var date = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1):date.getMonth()+1) + '-';
var D = (date.getDate()< 10 ? '0'+date.getDate():date.getDate())+ ' ';
// var h = (date.getHours() < 10 ? '0'+date.getHours():date.getHours())+ ':';
// var m = (date.getMinutes() < 10 ? '0'+date.getMinutes():date.getMinutes()) + ':';
// var s = date.getSeconds() < 10 ? '0'+date.getSeconds():date.getSeconds();
return Y+M+D;
}
4)css
.search-kk {
width: calc(100%);
height: 80rpx;
box-sizing: border-box;
padding: 0 20rpx;
line-height: 70rpx;
font-size: 28rpx;
color: #333;
overflow-x: hidden;
border-radius: 10rpx;
}
3 组件配置说明
datetype 日期类型,默认datetime
minDate 可选的最小值,默认new Date((new Date().getFullYear() - 2), 10, 1).getTime()
maxDate 可选最大值,默认new Date((new Date().getFullYear() + 2), 10, 1).getTime()
currentDate 当前日期,默认new Date().getTime()
formatLength:日期选择后返回的格式化后的值的长度
1 YYYY
2 YYYY-MM
3 YYYY-MM-DD
4 YYYY-MM-DD hh
5 YYYY-MM-DD hh:mm
6 YYYY-MM-DD hh:mm:ss
4 使用
1)json文件中引入组件
"my-datepicker": "/components/my-datepicker/my-datepicker"
2)wxml
<my-datepicker datetype="datetime" formatLength="5" bindgetdatevalue="getdatevalue"></my-datepicker>
3)js
getdatevalue(e){
console.log('-----------',e)
}
5 实例效果
1)wxml
<view class="search-tt2 ,require-label:before">日期: </view>
<view class="search-kk st">
<my-datepicker datetype="datetime" formatLength="5" bindgetdatevalue="getdatevalue"></my-datepicker>
</view>
2)wxss
.search-tt2 {
float: left;
width: 180rpx;
height: 80rpx;
line-height: 80rpx;
font-size: 32rpx;
color: #333;
margin-left: 70rpx;
margin-top: 10px;
}
.search-kk {
width: calc(80% - 150rpx);
height: 80rpx;
border: 1px solid rgb(169, 167, 167);
box-sizing: border-box;
padding: 0 20rpx;
line-height: 70rpx;
font-size: 28rpx;
color: #333;
overflow-x: hidden;
border-radius: 10rpx;
}
.st {
margin-top: 20rpx;
}
3)效果

