@cataract6545/tmui
Version:
tm-vuetify是一个新势力由主题驱动的UI组件库,相比其它优势大,组件全,设计趋势紧跟未来。具有主题生成,主题实时切换,暗黑实时切换,lottie动画,图表等新颖功能,tmui TMUI
171 lines (154 loc) • 5.48 kB
text/typescript
import { showDetail, timeDetailType, timeArrayType } from "./interface"
import * as dayjs from "../../tool/dayjs/esm/index"
import isSameOrBefore from '../../tool/dayjs/esm/plugin/isSameOrBefore/index';
import isSameOrAfter from '../../tool/dayjs/esm/plugin/isSameOrAfter/index';
import isBetween from '../../tool/dayjs/esm/plugin/isBetween/index';
type dateType = 'year' | 'month' | 'date' | 'hour' | 'minute' | 'second'
const DayJs = dayjs.default;
DayJs.extend(isBetween)
DayJs.extend(isSameOrBefore)
DayJs.extend(isSameOrAfter)
function rangeNumber(from = 0, to = 0) {
let range: Array<number> = []
from = from >= 0 ? from : 1
for (let i = from; i <= to; i++) {
range.push(i)
}
return range
}
/** 根据显示的时间字段返回相关的时间列的可选选项. */
export function rangeTimeArray(dateStr: string | number | Date | dayjs.Dayjs, start: string | number | Date | dayjs.Dayjs, end: string | number | Date | dayjs.Dayjs, detail: showDetail) {
let startDayjs = DayJs(start);
let endDayjs = DayJs(end);
let dateDayjs = DayJs(dateStr);
// 计算每一列表数组开始和结束的数字.
let dateArray = {
year: [] as Array<number>,
month: [] as Array<number>,
date: [] as Array<number>,
hour: [] as Array<number>,
minute: [] as Array<number>,
second: [] as Array<number>,
};
// 计算年份数组
let startYear = startDayjs.year();
let endYear = endDayjs.year();
for (let year = startYear; year <= endYear; year++) {
dateArray.year.push(year);
}
// 计算月份数组
let startMonth = dateDayjs.isSame(startDayjs, 'year') ? startDayjs.month() : 0;
let endMonth = dateDayjs.isSame(endDayjs, 'year') ? endDayjs.month() : 11;
for (let month = startMonth; month <= endMonth; month++) {
dateArray.month.push(month);
}
// 计算日期数组
let startDate = dateDayjs.isSame(startDayjs, 'month') ? startDayjs.date() : 1;
let endDate = dateDayjs.isSame(endDayjs, 'month') ? endDayjs.date() : dateDayjs.daysInMonth();
for (let date = startDate; date <= endDate; date++) {
dateArray.date.push(date);
}
// 计算小时数组
let startHour = dateDayjs.isSame(startDayjs, 'date') ? startDayjs.hour() : 0;
let endHour = dateDayjs.isSame(endDayjs, 'date') ? endDayjs.hour() : 23;
for (let hour = startHour; hour <= endHour; hour++) {
dateArray.hour.push(hour);
}
// 计算分钟数组
let startMinute = dateDayjs.isSame(startDayjs, 'hour') ? startDayjs.minute() : 0;
let endMinute = dateDayjs.isSame(endDayjs, 'hour') ? endDayjs.minute() : 59;
for (let minute = startMinute; minute <= endMinute; minute++) {
dateArray.minute.push(minute);
}
// 计算秒钟数组
let startSecond = dateDayjs.isSame(startDayjs, 'minute') ? startDayjs.second() : 0;
let endSecond = dateDayjs.isSame(endDayjs, 'minute') ? endDayjs.second() : 59;
for (let second = startSecond; second <= endSecond; second++) {
dateArray.second.push(second);
}
return dateArray;
}
/**
* 根据现有时间取得当前的索引位置顺序
* @param tmArray
* @param nowtime
* @param detail
*/
export function getIndexNowbydate(tmArray: timeArrayType, nowtime: dayjs.Dayjs, detail: showDetail) {
const d = DayJs(nowtime)
const intermediate = [
[timeDetailType.year, detail.year],
[timeDetailType.month, detail.month],
[timeDetailType.day, detail.day],
[timeDetailType.hour, detail.hour],
[timeDetailType.minute, detail.minute],
[timeDetailType.second, detail.second]
];
const idx = intermediate.filter(m => m[1]).map(m => {
const type = m[0] as timeDetailType;
const index = tmArray[type].findIndex(n => n === d.get(type))
return index === -1 ? 0 : index;
});
return [
...idx,
...[0, 0, 0, 0, 0, 0]
].slice(0, 6);
}
/**
* 根据现有索引值返回当前时间。
* @param tmArray
* @param nowtime
* @param detail
*/
export function getNowbyIndex(tmArray: timeArrayType, nowIndex: Array<number>, detail: showDetail) {
const intermediate = [
[timeDetailType.year, detail.year],
[timeDetailType.month, detail.month],
[timeDetailType.day, detail.day],
[timeDetailType.hour, detail.hour],
[timeDetailType.minute, detail.minute],
[timeDetailType.second, detail.second]
];
function getValue(type: timeDetailType) {
const index = intermediate.filter(m => m[1]).findIndex(m => m[0] === type);
if (index !== -1) {
return tmArray[type][nowIndex[index]];
}
return tmArray[type][tmArray[type].length - 1];
}
let year = getValue(timeDetailType.year);
let month = getValue(timeDetailType.month);
let date = getValue(timeDetailType.day);
let hour = getValue(timeDetailType.hour);
let minute = getValue(timeDetailType.minute);
let second = getValue(timeDetailType.second);
let str = year
+ "/" +
(month + 1)
+ "/" + date
+ " " +
hour
+ ":" +
minute
+ ":" +
second
return DayJs(str).format("YYYY/MM/DD HH:mm:ss")
}
/**
* 检查提供的时候是否是有效的时间段内,并返回正确的可用时间.
* @param nowdate
* @param start
* @param end
*/
export function checkNowDateisBetween(nowdate: string | number | Date | dayjs.Dayjs, start: string | number | Date | dayjs.Dayjs, end: string | number | Date | dayjs.Dayjs) {
nowdate = DayJs(nowdate).isValid() ? DayJs(nowdate) : DayJs()
start = DayJs(start)
end = DayJs(end)
if (nowdate.isSameOrBefore(start)) {
return start.format("YYYY/MM/DD HH:mm:ss")
}
if (nowdate.isSameOrAfter(end)) {
return end.format("YYYY/MM/DD HH:mm:ss")
}
return nowdate.format("YYYY/MM/DD HH:mm:ss")
}