123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- import CustomPickerView from '../customPickerView/index.vue';
- import DateUtil from '../dateTimePicker/dateUtil';
- import { DATE_TYPES } from './constant';
- export default {
- components: {
- CustomPickerView
- },
- props: {
- // 日期模式,1:年月日(默认),2:年月,3:年份,4:年月日时分秒,5:时分秒,6:时分
- mode: {
- type: Number,
- default: DATE_TYPES.YMD
- },
- // 可选的最小日期,默认十年前
- minDate: {
- type: String,
- default: ''
- },
- // 可选的最大日期,默认十年后
- maxDate: {
- type: String,
- default: ''
- },
- // 默认选中日期(注意要跟日期模式对应)
- defaultDate: {
- type: String,
- default: ''
- }
- },
- data() {
- return {
- selectYear: new Date().getFullYear(),
- selectMonth: new Date().getMonth() + 1, // 选中的月份,1~12
- selectDay: new Date().getDate(),
- selectHour: new Date().getHours(),
- selectMinute: new Date().getMinutes(),
- selectSecond: new Date().getSeconds()
- };
- },
- watch: {
- defaultDate: {
- immediate: true,
- handler(val) {
- if (val) {
- if (this.mode == DATE_TYPES.YM && val.replace(/\-/g, '/').split('/').length == 2) {
- // 日期模式为年月时有可能传进来的defaultDate是2022-02这样的格式,在ios下new Date会报错,加上日期部分做兼容
- val += '-01';
- } else if (this.mode == DATE_TYPES.HMS || this.mode == DATE_TYPES.HM) {
- // 只有时分秒或者只有时分是不能调用new Date生成Date对象的,先加上一个假设的年月日(就取当年一月一日)来兼容
- const now = new Date();
- val = `${now.getFullYear()}-01-01 ${val}`;
- }
- let date = new Date(DateUtil.handleDateStr(val));
- this.selectYear = date.getFullYear();
- this.selectMonth = date.getMonth() + 1;
- this.selectDay = date.getDate();
- this.selectHour = date.getHours();
- this.selectMinute = date.getMinutes();
- this.selectSecond = date.getSeconds();
- }
- }
- }
- },
- computed: {
- minDateObj() {
- let minDate = this.minDate;
- if (minDate) {
- if (this.mode == DATE_TYPES.YM && minDate.replace(/\-/g, '/').split('/').length == 2) {
- // 日期模式为年月时有可能传进来的minDate是2022-02这样的格式,在ios下new Date会报错,加上日期部分做兼容
- minDate += '-01';
- } else if (this.mode == DATE_TYPES.HMS || this.mode == DATE_TYPES.HM) {
- // 只有时分秒或者只有时分是不能调用new Date生成Date对象的,先加上一个假设的年月日(就取当年一月一日)来兼容
- const now = new Date();
- minDate = `${now.getFullYear()}-01-01 ${minDate}`;
- }
- return new Date(DateUtil.handleDateStr(minDate));
- } else {
- // 没有传最小日期,默认十年前
- let year = new Date().getFullYear() - 10;
- minDate = new Date(year, 0, 1);
- return minDate;
- }
- },
- maxDateObj() {
- let maxDate = this.maxDate;
- if (maxDate) {
- if (this.mode == DATE_TYPES.YM && maxDate.replace(/\-/g, '/').split('/').length == 2) {
- // 日期模式为年月时有可能传进来的maxDate是2022-02这样的格式,在ios下new Date会报错,加上日期部分做兼容
- maxDate += '-01';
- } else if (this.mode == DATE_TYPES.HMS || this.mode == DATE_TYPES.HM) {
- // 只有时分秒或者只有时分是不能调用new Date生成Date对象的,先加上一个假设的年月日(就取当年一月一日)来兼容
- const now = new Date();
- maxDate = `${now.getFullYear()}-01-01 ${maxDate}`;
- }
- return new Date(DateUtil.handleDateStr(maxDate));
- } else {
- // 没有传最大日期,默认十年后
- let year = new Date().getFullYear() + 10;
- maxDate = new Date(year, 11, 31);
- return maxDate;
- }
- },
- years() {
- let years = [];
- let minYear = this.minDateObj.getFullYear();
- let maxYear = this.maxDateObj.getFullYear();
- for (let i = minYear; i <= maxYear; i++) {
- years.push(i);
- }
- return years;
- },
- months() {
- let months = [];
- let minMonth = 1;
- let maxMonth = 12;
- // 如果选中的年份刚好是最小可选日期的年份,那月份就要从最小日期的月份开始
- if (this.selectYear == this.minDateObj.getFullYear()) {
- minMonth = this.minDateObj.getMonth() + 1;
- }
- // 如果选中的年份刚好是最大可选日期的年份,那月份就要在最大日期的月份结束
- if (this.selectYear == this.maxDateObj.getFullYear()) {
- maxMonth = this.maxDateObj.getMonth() + 1;
- }
- for (let i = minMonth; i <= maxMonth; i++) {
- months.push(i);
- }
- return months;
- },
- days() {
- // 一年中12个月每个月的天数
- let monthDaysConfig = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
- // 闰年2月有29天
- if (this.selectMonth == 2 && this.selectYear % 4 == 0) {
- monthDaysConfig[1] = 29;
- }
- let minDay = 1;
- let maxDay = monthDaysConfig[this.selectMonth - 1];
- if (this.selectYear == this.minDateObj.getFullYear() && this.selectMonth == this.minDateObj.getMonth() + 1) {
- minDay = this.minDateObj.getDate();
- }
- if (this.selectYear == this.maxDateObj.getFullYear() && this.selectMonth == this.maxDateObj.getMonth() + 1) {
- maxDay = this.maxDateObj.getDate();
- }
- let days = [];
- for (let i = minDay; i <= maxDay; i++) {
- days.push(i);
- }
- return days;
- },
- hours() {
- let hours = [];
- let minHour = 0;
- let maxHour = 23;
- if (
- this.selectYear == this.minDateObj.getFullYear() &&
- this.selectMonth == this.minDateObj.getMonth() + 1 &&
- this.selectDay == this.minDateObj.getDate()
- ) {
- minHour = this.minDateObj.getHours();
- }
- if (
- this.selectYear == this.maxDateObj.getFullYear() &&
- this.selectMonth == this.maxDateObj.getMonth() + 1 &&
- this.selectDay == this.maxDateObj.getDate()
- ) {
- maxHour = this.maxDateObj.getHours();
- }
- for (let i = minHour; i <= maxHour; i++) {
- hours.push(i);
- }
- return hours;
- },
- minutes() {
- let mins = [];
- let minMin = 0;
- let maxMin = 59;
- if (
- this.selectYear == this.minDateObj.getFullYear() &&
- this.selectMonth == this.minDateObj.getMonth() + 1 &&
- this.selectDay == this.minDateObj.getDate() &&
- this.selectHour == this.minDateObj.getHours()
- ) {
- minMin = this.minDateObj.getMinutes();
- }
- if (
- this.selectYear == this.maxDateObj.getFullYear() &&
- this.selectMonth == this.maxDateObj.getMonth() + 1 &&
- this.selectDay == this.maxDateObj.getDate() &&
- this.selectHour == this.maxDateObj.getHours()
- ) {
- maxMin = this.maxDateObj.getMinutes();
- }
- for (let i = minMin; i <= maxMin; i++) {
- mins.push(i);
- }
- return mins;
- },
- seconds() {
- let seconds = [];
- let minSecond = 0;
- let maxSecond = 59;
- if (
- this.selectYear == this.minDateObj.getFullYear() &&
- this.selectMonth == this.minDateObj.getMonth() + 1 &&
- this.selectDay == this.minDateObj.getDate() &&
- this.selectHour == this.minDateObj.getHours() &&
- this.selectMinute == this.minDateObj.getMinutes()
- ) {
- minSecond = this.minDateObj.getSeconds();
- }
- if (
- this.selectYear == this.maxDateObj.getFullYear() &&
- this.selectMonth == this.maxDateObj.getMonth() + 1 &&
- this.selectDay == this.maxDateObj.getDate() &&
- this.selectHour == this.maxDateObj.getHours() &&
- this.selectMinute == this.maxDateObj.getMinutes()
- ) {
- maxSecond = this.maxDateObj.getSeconds();
- }
- for (let i = minSecond; i <= maxSecond; i++) {
- seconds.push(i);
- }
- return seconds;
- },
- // 传给pickerView组件的数组,根据mode来生成不同的数据
- dateConfig() {
- let years = this.years.map((y) => y + '年');
- let months = this.months.map((m) => m + '月');
- let days = this.days.map((d) => d + '日');
- let hours = this.hours.map((h) => h + '时');
- let minutes = this.minutes.map((m) => m + '分');
- let seconds = this.seconds.map((s) => s + '秒');
- let ret = [];
- switch (this.mode) {
- case DATE_TYPES.YM:
- ret = [years, months];
- break;
- case DATE_TYPES.Y:
- ret = [years];
- break;
- case DATE_TYPES['YMD-HMS']:
- ret = [years, months, days, hours, minutes, seconds];
- break;
- case DATE_TYPES.HMS:
- ret = [hours, minutes, seconds];
- break;
- case DATE_TYPES.HM:
- ret = [hours, minutes];
- break;
- default:
- ret = [years, months, days];
- break;
- }
- return ret;
- },
- selectVals() {
- let ret = [];
- switch (this.mode) {
- case DATE_TYPES.YM:
- ret = [this.selectYear + '年', this.selectMonth + '月'];
- break;
- case DATE_TYPES.Y:
- ret = [this.selectYear + '年'];
- break;
- case DATE_TYPES['YMD-HMS']:
- ret = [
- this.selectYear + '年',
- this.selectMonth + '月',
- this.selectDay + '日',
- this.selectHour + '时',
- this.selectMinute + '分',
- this.selectSecond + '秒'
- ];
- break;
- case DATE_TYPES.HMS:
- ret = [this.selectHour + '时', this.selectMinute + '分', this.selectSecond + '秒'];
- break;
- case DATE_TYPES.HM:
- ret = [this.selectHour + '时', this.selectMinute + '分'];
- break;
- default:
- ret = [this.selectYear + '年', this.selectMonth + '月', this.selectDay + '日'];
- break;
- }
- return ret;
- }
- },
- methods: {
- onChangePickerValue(e) {
- const { value } = e;
- if (this.mode == DATE_TYPES.YM && value[0] && value[1]) {
- // 年月模式
- this.selectYear = Number(value[0].replace('年', ''));
- this.selectMonth = Number(value[1].replace('月', ''));
- } else if (this.mode == DATE_TYPES.Y && value[0]) {
- // 只有年份模式
- this.selectYear = Number(value[0].replace('年', ''));
- } else if (this.mode == DATE_TYPES['YMD-HMS'] && value[0] && value[1] && value[2] != '' && value[3] && value[4] && value[5]) {
- // 年月日时分秒模式
- this.selectYear = Number(value[0].replace('年', ''));
- this.selectMonth = Number(value[1].replace('月', ''));
- this.selectDay = Number(value[2].replace('日', ''));
- this.selectHour = Number(value[3].replace('时', ''));
- this.selectMinute = Number(value[4].replace('分', ''));
- this.selectSecond = Number(value[5].replace('秒', ''));
- } else if (this.mode == DATE_TYPES.HMS && value[0] && value[1] && value[2]) {
- // 时分秒模式
- this.selectHour = Number(value[0].replace('时', ''));
- this.selectMinute = Number(value[1].replace('分', ''));
- this.selectSecond = Number(value[2].replace('秒', ''));
- } else if (this.mode == DATE_TYPES.HM && value[0] && value[1]) {
- // 时分模式
- this.selectHour = Number(value[0].replace('时', ''));
- this.selectMinute = Number(value[1].replace('分', ''));
- } else if (value[0] && value[1] && value[2]) {
- // 默认,年月日模式
- this.selectYear = Number(value[0].replace('年', ''));
- this.selectMonth = Number(value[1].replace('月', ''));
- this.selectDay = Number(value[2].replace('日', ''));
- } else {
- // 其他情况可能是pickerView返回的数据有问题,不处理
- console.log('onChangePickerValue其他情况');
- return;
- }
- let formatTmpl = 'YYYY-MM-DD';
- switch (this.mode) {
- case DATE_TYPES.YM:
- formatTmpl = 'YYYY-MM';
- break;
- case DATE_TYPES.Y:
- formatTmpl = 'YYYY';
- break;
- case DATE_TYPES['YMD-HMS']:
- formatTmpl = 'YYYY-MM-DD HH:mm';
- break;
- case DATE_TYPES.HMS:
- formatTmpl = 'HH:mm:ss';
- break;
- case DATE_TYPES.HM:
- formatTmpl = 'HH:mm';
- break;
- default:
- break;
- }
- this.$emit(
- 'onChange',
- DateUtil.formatDate(
- new Date(`${this.selectYear}/${this.selectMonth}/${this.selectDay} ${this.selectHour}:${this.selectMinute}:${this.selectSecond}`),
- formatTmpl
- )
- );
- }
- }
- };
|