效果如下

微信小程序

1.首先创建一个components,接着创建一个文件picker

2.在picker.wxml文件里写入:

<picker

mode="multiSelector"

range="{{rangeList}}"

value="{{rangeValue}}"

bindchange="selectChangeFn"

bindcolumnchange="selectColumnChangeFn">

<slot></slot>

</picker>

3.在picker.js文件里写:

Component({

//定义组件生命周期函数

lifetimes: {

attached() {

//初始化时间选择器

this._initDateTimePickerFn()

},

detached() { }

},

//对 <2.2.3 版本基础库的兼容

attached() {

//初始化时间选择器

this._initDateTimePickerFn()

},

detached() {

},

//组件相关配置项

options: {

multipleSlots: true // 开启使用多个插槽

},

//组件的属性列表

properties: {

mode: {  // 选择器类型

type: String,

require: true

},

value: { // 回显的时间

type: String,

value: ''

}

},

//组件的初始数据

data: {

rangeList: [],

rangeValue: [],

dateDetails: ['年', '月', '时', '分', '秒']

},

//组件的方法列表

methods: {

//初始化时间选择器

_initDateTimePickerFn() {

try {

const { value, mode } = this.data

if (mode != 'dateminute' && mode != 'datetime') {

throw new CommonException('请输入合法的时间选择器类型!', -1)

}

//获取到当前时间

let showTimeValue = this._validateShowTime(value, mode)

// 获取年份

const currentYear = showTimeValue.substring(0, showTimeValue.indexOf('-'))

const currentMouth = showTimeValue.split(" ")[0].split('-')[1]

const yearList = this._gotDateTimeList({

_start: Number(currentYear) - 100,

_end: Number(currentYear) + 100, _type: 0

})

// 获取月份

const monthList = this._gotDateTimeList({ _start: 1, _end: 12, _type: 1 })

//获取天数

const dayList = this._gotDayList(currentYear, currentMouth)

// 获取小时

const hourList = this._gotDateTimeList({ _start: 0, _end: 23, _type: 2 })

// 获取分钟

const munithList = this._gotDateTimeList({ _start: 0, _end: 59, _type: 3 })

// 获取秒

const secondList = this._gotDateTimeList({ _start: 0, _end: 59, _type: 4 })

let rangeList = new Array()

rangeList.push(yearList)

rangeList.push(monthList)

rangeList.push(dayList)

rangeList.push(hourList)

rangeList.push(munithList)

mode === "datetime" && rangeList.push(secondList)

this.setData({

rangeList

}, () => {

this._echoDateTime(showTimeValue) // 初始化时间显示

})

} catch (err) {

console.log(err)

}

},

//验证显示的时间是否合法

//@param {Number} _value 要验证的时间

//@param {Number} _mode  选择器类型

_validateShowTime(_value, _mode) {

let currentTime = formatTime(new Date()).replace(/\//g, "-")

let showTimeValue = _value.trim() || currentTime

const secondReg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/

const munithReg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}$/

if (_mode === 'dateminute') { // yyyy-MM-dd HH:mm

// 验证是否合法

secondReg.test(showTimeValue) && (showTimeValue = showTimeValue.substring(0, showTimeValue.lastIndexOf(':')))

munithReg.test(showTimeValue) || (showTimeValue = currentTime.substring(0, currentTime.lastIndexOf(':')))

} else { // yyyy-MM-dd HH:mm:ss

munithReg.test(showTimeValue) && (showTimeValue += ':00')

secondReg.test(showTimeValue) || (showTimeValue = currentTime)

}

return showTimeValue

},

//获取年份、月份、小时、分钟、秒

//@param {Number} _start 开始值

//@param {Number} _end   结束值

//@param {Number} _type  类型

_gotDateTimeList({ _start, _end, _type }) {

let resultDataList = new Array()

for (let i = _start; i <= _end; i++) {

resultDataList.push(this._addZore(i) + this.data.dateDetails[_type])

}

return resultDataList

},

//获取天数

//@param {Number} _year  年份

//@param {Number} _mouth  月份

_gotDayList(_year, _mouth) {

let now = new Date(_year, _mouth, 0)

const dayLength = now.getDate()

let dayList = new Array()

for (let i = 1; i <= dayLength; i++) {

dayList.push(this._addZore(i) + '日')

}

return dayList

},

//补零

//@param {Number} _num  数值

_addZore(_num) {

return _num < 10 ? '0' + _num : _num.toString()

},

//回显时间

//@param {Number} _showTimeValue  初始化时要显示的时间

_echoDateTime(_showTimeValue) {

const rangeList = this.data.rangeList

let rangeValue = new Array()

const list = _showTimeValue.split(/[\-|\:|\s]/)

list.map((el, index) => {

rangeList[index].map((item, itemIndex) => {

item.indexOf(el) !== -1 && rangeValue.push(itemIndex)

})

})

this.setData({

rangeValue

})

},

//点击确定时触发的回调函数

//@param {Number} ev

selectChangeFn(ev) {

const selectValues = ev.detail.value

const rangeList = this.data.rangeList

let dateTime = ''

selectValues.map((el, index) => {

dateTime += rangeList[index][el].substring(0, rangeList[index][el].length - 1)

if (index == 0 || index == 1) {

dateTime += '-'

} else if (index == 3 || (index == 4 && index != selectValues.length - 1)) {

dateTime += ':'

} else if (index == 2 && index != selectValues.length - 1) {

dateTime += ' '

}

})

// 触发父组件把值传递给父组件

this.triggerEvent('change', { value: dateTime })

},

// 当具体的一项的值发生改变时触发

// @param {Number} ev

selectColumnChangeFn(ev) {

const { column, value } = ev.detail

let { rangeList, rangeValue } = this.data

let selectValue = Number(rangeList[column][value]

.substring(0, rangeList[column][value].length - 1))

if (column === 1) { // 改变月份

const currentYear = Number(rangeList[0][rangeValue[0]]

.substring(0, rangeList[0][rangeValue[0]].length - 1))

const dayList = this._gotDayList(currentYear, selectValue)

rangeList[column + 1] = dayList

}

this.setData({

rangeList

})

}

}

})

// 自定义异常

function CommonException(errMsg, code) {

this.errMsg = errMsg

this.code = code

}

// 格式化日期

const formatTime = date => {

const year = date.getFullYear()

const month = date.getMonth() + 1

const day = date.getDate()

const hour = date.getHours()

const minute = date.getMinutes()

const second = date.getSeconds()

return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')

}

const formatNumber = n => {

n = n.toString()

return n[1] ? n : '0' + n

}

4.然后在你要用到这个组件的json文件里引入进来(注意你的components是在你的根目录下,不然会找不到的)

{

"usingComponents": {

"Picker":"../../../../components/Picker/Picker"

}

}

5.在你要用到这个组件的wxml文件里写下:

<view>

<Picker mode="dateminute" name="starTime" type='text' value="{{starTime}}" bindchange="hourChange">

<view class="show-date-time-box">开始时间: {{starTime}}</view>

</Picker>

<Picker mode="dateminute" name="starTime" model:value="{{overTime}}" bindchange="bindoverTimeChange">

<view class="show-date-time-box">结束时间: {{overTime}}</view>

</Picker>

</view>

6.在js文件里写下:

page({

data:{

starTime: "", //开始时间

overTime: "", //结束时间

},

//开始时间

hourChange: function (e) {

console.log(e)

this.setData({

starTime: e.detail.value

})

},

//结束时间

bindoverTimeChange: function (e) {

console.log('picker发送选择改变,携带值为', e.detail.value)

this.setData({

overTime: e.detail.value

})

},

)}

创建微信小程序日期和时间的组件相关推荐

  1. 小程序日期加时间筛选组件

    小程序日期加时间筛选组件 新建component->date-time-picker .wxml <picker mode="multiSelector" class= ...

  2. 微信小程序日期与时间选择器

    最近在开发一款微信小程序,需要用到里面的时间选择器(picker),根据它本身的特点以及需要开发的内容,我对时间选择器做了一个简单的demo,大家可以看一下效果图. 效果图: 在微信小程序中,文件按照 ...

  3. 微信小程序 - 日期(起止)选择器组件

    原文链接 传送门 2019-01-03 : 修复了日期day-1,新增了年月日(除去时分秒),删除了不必要的touchmove 新增: column: ""(年月日) 配置: pi ...

  4. 微信小程序日期午别排班表

    微信小程序日期午别排班表 1.util.js //获取几天后日期 function dateCount(arg,date) {var date1 = arg;var date2 = new Date( ...

  5. 微信小程序时间加法_微信小程序获取系统时间、时间戳、时间时间戳加减

    微信小程序获取系统时间.时间戳.时间时间戳加减,微信小程序获取明天时间 //获取当前时间戳 var timestamp = Date.parse(new Date()); timestamp = ti ...

  6. 微信小程序渲染实时时间

    微信小程序渲染实时时间 1.看看在框架目录中是否有util文件夹,它用来存放工具栏的JavaScript函数 2.在要获取时间的.js文件中加载util.js文件 3.在onload方法中,调用uti ...

  7. java创建微信小程序二维码

    创建微信小程序二维码有两个接口需要 一个是获取tocken的接口 一个是生成二维码的接口 获取tocken接口 //**********填写你的小程序appid 和 secret public sta ...

  8. 微信小程序日期时分组件(年月日时分)--复制即用

    微信小程序日期组件(年月日时分)–复制即用 如图所示效果 第一步新建picker组件文件 1,pickerTime.js组件代码内容 // component/pickerTime/pickerTim ...

  9. 微信小程序日期转换时间戳

    微信小程序日期转换时间戳   安卓正常,IOS需要转换. 微信小程序内,字符串时间转换为时间戳 如果字符串格式为 "2020-02-02 15:35:08",此时直接 new Da ...

最新文章

  1. 使用Java监控工具出现 Can't attach to the process
  2. 有没有一种方法可以缓存GitHub凭证来推送提交?
  3. (转载)hadoop(13) 添加或删除datanode节点
  4. 强化学习核心文章一百篇
  5. Java黑皮书课后题第8章:*8.3(按考分对学生排序)重写程序清单8-2,按照正确答案个数的升序显示学生
  6. go语言第一个程序-hello world
  7. java treemap api_Java 8 Stream API toMap转换为TreeMap
  8. 【Guava】Google Guava本地高效缓存
  9. css-div定位详解
  10. 50 岁老码农:Python Bug 太多,我选 Rust 和 Go!
  11. ZJOI2019 线段树
  12. oracle执行计划更新,请教update和delete的执行计划
  13. java public就是可选吗_java 中的public
  14. 近期互联网公司大量裁员,这给计算机er带来哪些启示?
  15. 多边形的定义为什么要强调封闭图形_11.3.1 多边形讲解.ppt
  16. 历史库存sap_SAP 常用的库存表
  17. C语言编程>第三周 ⑦ 将一个数组逆序输出。
  18. python+opencv遇到的错误(长期更新)
  19. 影院活动管理系统 项目测试与部署
  20. 【网站】国内 前6名 Java开源CMS建站系统

热门文章

  1. 全志A40i开发板(4核ARM CortexA7)测评合集——存储介质读写测试
  2. 怎样获得淘宝/天猫淘口令真实url
  3. 数据驱动的软件智能化开发| ChinaOSC
  4. 再爆 Bug!Windows 11 任务栏、菜单栏无故消失,怎么解?
  5. 《大江大河2》中教科书般的精神自救-如何让反感你的人欣赏你
  6. OPPO手机进水不读卡,修复
  7. 云痕大数据 家长登录_云痕大数据平台的使用对初中英语教与学的作用
  8. 科技云报道:安全脱管不如托管
  9. 无限存储空间的蓝奏网盘你还不用?使用Python,直接获取直链!Python使用Requests和BS4实现蓝奏云直链解析与下载
  10. 自学编程系列——2 文件路径与文本读写