123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375 |
- <template>
- <view class="jnpf-dateTime">
- <u-input input-align='right' type="select" :select-open="selectShow" v-model="innerValue"
- :placeholder="placeholder" @click="openSelect" :disabled="disabled">
- </u-input>
- <u-popup v-model="selectShow" mode="bottom" @click="colse()">
- <view class="t-pop" @tap.stop>
- <view class="pop-main">
- <view class="top">
- <view class="top-l">
- <view @click="changeSwp('1')" :style="{color:sindex==1?'#1E79FF':'#333333'}">
- <text>{{checkyear}}</text>
- </view>
- <view @click="changeSwp('2')" :style="{color:sindex==2?'#1E79FF':'#333333'}"
- v-if="allDay==0">
- <text>{{checkhour}}:{{checkminute}}</text>
- </view>
- </view>
- <view class="top-r" @click="onOK()">
- <text>确定</text>
- </view>
- </view>
- <swiper class="swiper" circular :current-item-id="sindex">
- <swiper-item :item-id="'1'">
- <view class="mid">
- <scroll-view scroll-y="true" style="height: 960rpx" @scrolltolower="tolower">
- <uni-calendar ref="calendar" :insert="insert" :lunar='lunar'
- @change='calendarChange' :date='today' />
- </scroll-view>
- </view>
- </swiper-item>
- <swiper-item :item-id="'2'" v-if="allDay==0">
- <picker-view :indicator-style="indicatorStyle" :value="swiperTime" @change="bindChange"
- class="picker-view">
- <picker-view-column>
- <view class="item" v-for="(v,i) in 24" :key="i">{{i<10?'0'+i:i}}时</view>
- </picker-view-column>
- <picker-view-column>
- <view class="item" v-for="(v,i) in 12" :key="i">{{i<2?'0'+i*5:i*5}}分
- </view>
- </picker-view-column>
- </picker-view>
- </swiper-item>
- </swiper>
- </view>
- </view>
- </u-popup>
- </view>
- </template>
- <script>
- export default {
- name: "t-datetime",
- props: {
- type: {
- type: Number,
- default: 0 //默认时间后推0分钟
- },
- allDay: {
- type: Number,
- default: 0
- },
- modelValue: {
- type: String,
- default: ''
- },
- date: {
- type: Object,
- default: () => {}
- },
- placeholder: {
- type: String,
- default: '请选择'
- },
- delayMin: {
- type: Number,
- default: 0 //默认时间后推0分钟
- },
- disabled: {
- type: Boolean,
- default: false
- },
- canToday: { //是否可选择当天之前的时间
- type: Boolean,
- default: false
- },
- },
- data() {
- return {
- textList: ['日', '一', '二', '三', '四', '五', '六'],
- mList: [],
- checkyear: 0,
- checkmonth: 0,
- checkdate: 0,
- checkhour: 0,
- checkminute: 0,
- indicatorStyle: `height: 50px;`,
- sindex: '1',
- nowYear: 0,
- nowMonth: 0,
- nowDate: 0,
- lunar: false,
- insert: true,
- innerValue: '',
- selectShow: false,
- swiperTime: [],
- year: 0,
- hours: '',
- minutes: '',
- today: ''
- };
- },
- watch: {
- allDay(val) {
- let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
- this.today = allTime
- let srt = this.time(allTime)
- this.innerValue = ''
- if (srt) {
- this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
- } else {
- if (this.date.year == this.year) {
- this.innerValue = this.date.month + '月' + this.date.date + '日'
- } else {
- this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
- }
- }
- if (this.allDay == 0) {
- this.innerValue = this.innerValue + ' ' + this.hours + ':' +
- this.minutes
- }
- },
- date(val) {
- this.init()
- },
- },
- created() {
- this.timestampToTime(+new Date())
- this.init()
- },
- methods: {
- tolower() {
- this.init()
- },
- openSelect() {
- if (this.disabled) return
- this.selectShow = true
- this.init()
- },
- calendarChange(e) {
- this.date.year = e.year
- this.date.month = e.month
- this.date.date = e.date
- this.date.date = this.date.date < 10 ? '0' + Number(this.date.date) : this.date.date
- this.date.month = this.date.month < 10 ? '0' + Number(this.date.month) : this.date.month
- this.checkyear = this.year == this.date.year ? this.date.month + '月' + this.date.date + '日' : this.date
- .year +
- '年' + this.date.month + '月' + this.date.date + '日'
- this.sindex = '2'
- },
- init() {
- this.innerValue = ''
- this.today = this.date.year + '-' + this.date.month + '-' + this.date.date
- this.date.minutes = this.date.minutes < 10 ? '0' + Number(this.date.minutes) : this.date.minutes
- this.date.hours = this.date.hours < 10 ? '0' + Number(this.date.hours) : this.date.hours
- this.date.date = this.date.date < 10 ? '0' + Number(this.date.date) : this.date.date
- this.date.month = this.date.month < 10 ? '0' + Number(this.date.month) : this.date.month
- this.checkyear = this.year == this.date.year ? this.date.month + '月' + this.date.date + '日' : this.date
- .year + '年' + this.date.month + '月' + this.date.date + '日'
- this.checkhour = this.date.hours
- this.checkminute = this.date.minutes < 10 ? '0' + Number(this.date.minutes) : this.date.minutes
- let checkminute = this.date.minutes / 5
- this.swiperTime = [Number(this.checkhour), checkminute]
- this.hours = this.date.hours
- this.minutes = this.date.minutes
- let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
- let srt = this.time(allTime)
- if (srt) {
- this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
- } else {
- if (this.date.year == this.year) {
- this.innerValue = this.date.month + '月' + this.date.date + '日'
- } else {
- this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
- }
- }
- if (this.allDay == 0) {
- this.innerValue = this.innerValue + ' ' + this.hours + ':' +
- this.checkminute
- }
- },
- colse() {
- this.selectShow = false
- },
- bindChange(e) {
- const val = e.detail.value
- this.swiperTime = [val[0], val[1]]
- this.checkhour = Number(val[0]) < 10 ? '0' + val[0] : val[0]
- this.checkminute = val[1] == '天' ? '00' : val[1] < 2 ? '0' + val[1] * 5 : val[1] * 5
- },
- changeSwp(i) {
- this.sindex = i
- },
- onOK() {
- if (this.allDay == 1) {
- this.date.hours = '00'
- this.date.minutes = '00'
- } else {
- this.date.hours = this.checkhour
- this.date.minutes = this.checkminute
- }
- this.selectShow = false
- let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
- let srt = this.time(allTime)
- if (srt) {
- this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
- if (this.allDay == 0) {
- this.innerValue = this.innerValue + ' ' + this.date.hours +
- ':' + this.date.minutes
- }
- } else {
- if (this.date.year == this.year) {
- this.innerValue = this.date.month + '月' + this.date.date + '日'
- } else {
- this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
- }
- if (this.allDay == 0) {
- this.innerValue = this.innerValue + ' ' + this.date.hours +
- ':' + this.date.minutes
- }
- }
- this.selectShow = false
- this.$emit('confirm', this.date, this.type)
- },
- timestampToTime(timestamp) {
- var date = new Date(timestamp);
- this.year = date.getFullYear();
- },
- time(date) {
- if (this.date.year != this.year) return false
- let time_str = "";
- if (new Date(date).getDate() === new Date().getDate()) {
- time_str = "今天 · ";
- } else if (new Date(date).getDate() === (new Date().getDate() - 1)) {
- time_str = "昨天 · ";
- } else if (new Date(date).getDate() === (new Date().getDate() + 1)) {
- time_str = "明天 · ";
- } else if (new Date(date).getDate() < new Date().getDate()) {
- time_str = "";
- }
- return time_str;
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .jnpf-dateTime {
- width: 100%;
- :deep(.u-drawer) {
- z-index: 999 !important;
- }
- }
- :deep(.uni-calendar-item__weeks-box-item) {
- line-height: 36rpx;
- }
- .t-pop {
- width: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- .pop-main {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- align-items: center;
- background-color: #fff;
- border-radius: 24px;
- height: 900rpx;
- width: 100%;
- }
- }
- .swiper {
- height: 840rpx;
- width: 100vw;
- }
- .top {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- margin: 20rpx 0;
- .top-l {
- display: flex;
- flex-direction: row;
- margin-left: 30rpx;
- }
- .top-r {
- margin-right: 30rpx;
- color: #1E79FF;
- }
- }
- .calendar {
- display: flex;
- flex-wrap: wrap;
- flex-direction: row;
- align-items: center;
- width: 100vw;
- position: relative;
- }
- .ca-top {
- width: 14.2vw;
- display: flex;
- justify-content: center;
- align-items: center;
- height: 66rpx;
- z-index: 10;
- }
- .cell {
- width: 60rpx;
- height: 60rpx;
- display: flex;
- justify-content: center;
- align-items: center;
- align-content: center;
- border-radius: 30rpx;
- }
- .cell-active {
- background-color: #1E79FF;
- color: #fff;
- }
- .cabg {
- display: flex;
- justify-content: center;
- width: 100vw;
- font-size: 180rpx;
- color: beige;
- position: absolute;
- z-index: 9;
- }
- .picker-view {
- width: 750rpx;
- height: 600rpx;
- margin-top: 20rpx;
- }
- .item {
- height: 50px;
- display: flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- }
- </style>
|