Files
cashier_app/uni_modules/kux-dayjs/common/index.uts
2025-12-03 10:13:55 +08:00

1464 lines
38 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { DateFormat, LunarType, DiffUnit, FromToOptions, DatetimeOptions, IsBetweenContains, DatetimeUnit, IKuxDayjs } from "../utssdk/interface.uts";
import { Lunar } from './calendar';
import { DateType, DateUtil } from './date';
import { MONTHS, WEEKDAYS, MONTH_DAYS } from './constant';
import { floor } from './utils';
class KuxDayjs implements IKuxDayjs {
public d : Date
public dd : DateType
private lunar : Lunar
private dateUtil : DateUtil
private dateStr : string
private uniVersion : number
constructor(date : string = '', isTimestamp : boolean = false, isCST : boolean = true) {
this.uniVersion = uni.getSystemInfoSync().uniCompileVersionCode;
this.dateStr = date;
this.lunar = new Lunar();
this.dateUtil = new DateUtil();
const dd = this.dateUtil.getDate(date);
this.dd = dd;
this.d = new Date(dd.year, dd.month - 1, dd.date, dd.hour, dd.minute, dd.second, dd.millisecond);
// if (this.uniVersion >= 4.0) {
// this.d = new Date(date);
// }
if (isTimestamp) {
let timestamp = parseInt(date);
if (isCST) {
timestamp += 8 * 3600 * 1000;
}
this.fromTimestamp(timestamp);
}
}
/**
* 根据时间戳实例化
* @param {number} timestamp 时间戳
*/
private fromTimestamp(timestamp : number) : KuxDayjs {
const dd = this.dateUtil.parseTimestamp(timestamp);
this.dd = this.dateUtil.getDate(`${`${dd.year}`.padStart(2, '0')}-${`${dd.month}`.padStart(2, '0')}-${`${dd.day}`.padStart(2, '0')} ${`${dd.hours}`.padStart(2, '0')}:${`${dd.minutes}`.padStart(2, '0')}:${`${dd.seconds}`.padStart(2, '0')}.${`${dd.milliseconds}`.padStart(3, '0')}`);
this.d = new Date(dd.year, dd.month - 1, dd.day, dd.hours, dd.minutes, dd.seconds, dd.milliseconds);
return this;
}
/**
* 当前时间对象
* @description 返回一个基于指定日期和时间的 KuxDayjs 对象
* @param {string} date 日期时间字符串,比如:'2023-12-12 19:35:35'
*/
dayjs(date : string) : IKuxDayjs {
this.dateStr = date;
this.lunar = new Lunar();
this.dateUtil = new DateUtil();
const dd = this.dateUtil.getDate(date);
this.dd = dd;
// this.d = new Date(dd.year, dd.month - 1, dd.date, dd.hour, dd.minute, dd.second, dd.millisecond);
if (this.uniVersion >= 4.0) {
this.d = new Date(date);
}
return this;
}
/**
* 基于当前时间复制一个 KuxDayjs 对象
* @returns {KuxDayjs}
* @example
* const a = dayjs();
* const b = a.clone();
* // a 和 b 是两个独立的 KuxDayjs 对象
*/
clone() : IKuxDayjs {
return new KuxDayjs();
}
/**
* 日期格式化
* @description 根据传入的占位符返回格式化后的日期
* @param format 格式,如 'YYYY-MM-DD HH:mm:ss'
* @returns string
*/
format(format : string) : string {
const YYYY = `${this.d.getFullYear()}`;
const YY = YYYY.slice(-2);
const M = `${this.d.getMonth() + 1}`;
const MM = M.padStart(2, '0');
const DD = `${this.d.getDate()}`.padStart(2, '0');
const HH = `${this.d.getHours()}`.padStart(2, '0');
const mm = `${this.d.getMinutes()}`.padStart(2, '0');
const ss = `${this.d.getSeconds()}`.padStart(2, '0');
const SSS = `${this.d.getMilliseconds()}`.padStart(3, '0');
// 上午/下午
let ampm = 'AM';
let ampmCN = '上午';
let ampmZN = 'am';
let formattedHours = HH;
if (Math.abs(parseInt(HH)) >= 12 && (format.includes('A') || format.includes('a') || format.includes('AA'))) {
ampm = 'PM';
ampmCN = '下午';
ampmZN = 'pm';
formattedHours = `${(Math.abs(parseInt(HH)) - 12)}`.padStart(2, '0');
}
return format
.replace('YYYY', YYYY)
.replace('YY', YY)
.replace('MM', MM)
.replace('DD', DD)
.replace('HH', formattedHours)
.replace('mm', mm)
.replace('ss', ss)
.replace('SSS', SSS)
.replace('AA', ampmCN)
.replace('A', ampm)
.replace('a', ampmZN)
}
private _diffCommon(dd: DateType, time1: number, time2: number, unit: DiffUnit, strict: boolean): number {
// 计算两个日期的毫秒数差
const diffInMilliseconds = Math.abs(time1 - time2);
// 秒数差
const diffSeconds = diffInMilliseconds / 1000;
// 分钟差
const diffMinutes = diffSeconds / 60;
// 小时差
const diffHours = diffMinutes / 60;
// 天数差
const diffDays = diffHours / 24;
// 周数差
// const diffWeeks = diffDays / 7;
const week1 = Math.ceil((new Date(dd.year, dd.month, dd.date).getDate() - 1) / 7);
const week2 = Math.ceil((this.d.getDate() - 1) / 7);
const diffWeeks = Math.abs(week1 - week2);
// 月数差
const year1 = dd.year;
const year2 = this.d.getFullYear();
const month1 = dd.month;
const month2 = this.d.getMonth() + 1;
const diffMonths = (year1 - year2) * 12 + (month1 - month2);
// 年数差
const diffYear = year1 - year2;
// 判断单位
let data : number;
switch (unit) {
case 'millisecond':
data = diffInMilliseconds;
break;
case 'ms':
data = diffInMilliseconds;
break;
case 'second':
data = diffSeconds;
break;
case 's':
data = diffSeconds;
break;
case 'minute':
data = diffMinutes;
break;
case 'M':
data = diffMinutes;
break;
case 'hour':
data = diffHours;
break;
case 'h':
data = diffHours;
break;
case 'week':
data = diffWeeks;
break;
case 'w':
data = diffWeeks;
break;
case 'month':
data = diffMonths;
break;
case 'm':
data = diffMonths;
break;
case 'y':
data = diffYear;
break;
case 'year':
data = diffYear;
break;
default:
data = diffDays;
break;
}
if (!strict) {
// data = Math.floor(data);
data = floor(data);
}
return Math.abs(data);
}
private _diffByDate(date: IKuxDayjs, unit: DiffUnit, strict: boolean): number {
const time1 = this.d.getTime();
const time2 = date.d.getTime();
return this._diffCommon(date.dd, time1, time2, unit, strict);
}
private _diff(date : string, unit : DiffUnit, strict : boolean) : number {
// 将日期转换为毫秒数
const time1 = this.d.getTime();
const dd = this.dateUtil.getDate(date);
const time2 = new Date(dd.year, dd.month - 1, dd.date, dd.hour, dd.minute, dd.second, dd.millisecond).getTime();
return this._diffCommon(dd, time1, time2, unit, strict);
}
diff(date : IKuxDayjs) : number
diff(date : string) : number
diff(date : IKuxDayjs, unit : DiffUnit | null) : number
diff(date : string, unit : DiffUnit | null) : number
diff(date : IKuxDayjs, unit : DiffUnit | null, strict : boolean | null): number
diff(date : string, unit : DiffUnit | null, strict : boolean | null) : number
// #ifndef APP-HARMONY
diff(date : any, unit : DiffUnit | null, strict : boolean | null) : number {
// #ifdef APP-ANDROID
if (date instanceof IKuxDayjs) {
return this._diffByDate(date as IKuxDayjs, unit ?? 'ms', strict ?? false);
}
// #endif
// #ifndef APP-ANDROID
if (date instanceof KuxDayjs) {
return this._diffByDate(date as IKuxDayjs, unit ?? 'ms', strict ?? false);
}
// #endif
return this._diff(`${date}`, unit ?? 'ms', strict ?? false);
}
// #endif
// #ifdef APP-HARMONY
diff(date : any, unit ?: DiffUnit | null, strict ?: boolean | null) : number {
// #ifdef APP-ANDROID
if (date instanceof IKuxDayjs) {
return this._diffByDate(date as IKuxDayjs, unit ?? 'ms', strict ?? false);
}
// #endif
// #ifndef APP-ANDROID
if (date instanceof KuxDayjs) {
return this._diffByDate(date as IKuxDayjs, unit ?? 'ms', strict ?? false);
}
// #endif
return this._diff(`${date}`, unit ?? 'ms', strict ?? false);
}
// #endif
private _calendar(year : number, month : number) : DateFormat[] {
let outDate : DateFormat[] = [];
let date = new Date();
let curYear = year;
let curMonth = month;
if (isNaN(curYear) || curYear < 1900) {
curYear = date.getFullYear();
}
if (isNaN(curMonth) || curMonth < 1) {
curMonth = date.getMonth() + 1;
}
// 获取当月第一天
const firstDayOfThisMonth = new Date(curYear, curMonth - 1, 1);
const preMonthDay = firstDayOfThisMonth.getDay();
// 获取上月的最后一天即本月第0天
const lastDayOfPreMonth = new Date(curYear, curMonth - 1, 0);
const lastDateOfLastMonth = lastDayOfPreMonth.getDate();
// 获取本月最后一天即下月第0天
const lastDayOfThisMonth = new Date(curYear, curMonth, 0);
const lastDateOfThisMonth = lastDayOfThisMonth.getDate();
// 获取周日期数据一个月最多跨6周即6 * 7格式排版
for (let i = 0; i < 6 * 7; i++) {
// 获取当前排序日期
let thisYear : number = curYear,
thisMonth : number = curMonth,
dateN : number = i + 1 - preMonthDay,
cursorDate : number = dateN;
if (dateN <= 0) {
thisMonth -= 1;
cursorDate = dateN + lastDateOfLastMonth;
} else if (dateN > lastDateOfThisMonth) {
// date大于本月最后一天为下月预留天数
thisMonth += 1;
cursorDate = dateN - lastDateOfThisMonth;
}
if (thisMonth == 13) {
thisMonth = 1;
thisYear += 1;
}
if (thisMonth == 0) {
thisMonth = 12;
thisYear -= 1;
}
// 计算该日期与当前时间的天数差
// const diffInDays = this.diff()
const startDate = new Date(thisYear, thisMonth - 1, cursorDate);
const endDate = new Date(this.d.getFullYear(), this.d.getMonth(), this.d.getDate());
const fullDate = `${thisYear}-${`${thisMonth}`.padStart(2, '0')}-${`${cursorDate}`.padStart(2, '0')}`;
let diffInDays = this.diff(fullDate);
// let diffInDays = 0;
if (startDate.getTime() < endDate.getTime()) {
diffInDays *= -1;
}
outDate.push({
year: thisYear,
month: thisMonth,
date: cursorDate,
isToday: this.dateUtil.getlunar(thisYear, thisMonth, cursorDate).isToday,
diffDays: diffInDays,
render: {},
lunar: {
month: this.lunar.toChinaMonth(this.lunar.solar_date(thisYear, thisMonth, cursorDate).lunarM),
date: this.lunar.toChinaDay(this.lunar.solar_date(thisYear, thisMonth, cursorDate).lunarD)
} as LunarType,
fullLunar: this.lunar.solar_date(thisYear, thisMonth, cursorDate),
fullDate
} as DateFormat)
}
return outDate;
}
calendar() : DateFormat[]
calendar(year : number | null) : DateFormat[]
// #ifndef APP-HARMONY
calendar(year : number | null, month : number | null) : DateFormat[] {
return this._calendar(year ?? 0, month ?? 0);
}
// #endif
// #ifdef APP-HARMONY
calendar(year ?: number | null, month ?: number | null) : DateFormat[] {
return this._calendar(year ?? 0, month ?? 0);
}
// #endif
private _millsecond(ms : number) : number {
if (ms > -1) {
return this.d.getTime();
}
return this.d.setMilliseconds(ms);
}
millisecond() : number
// #ifndef APP-HARMONY
millisecond(ms : number | null) : number {
return this._millsecond(ms ?? -1);
}
// #endif
// #ifdef APP-HARMONY
millisecond(ms ?: number | null) : number {
return this._millsecond(ms ?? -1);
}
// #endif
private _second(s : number) : number {
if (s > -1) {
return this.d.setSeconds(s);
}
return this.d.getSeconds();
}
second() : number
// #ifndef APP-HARMONY
second(s : number | null) : number {
return this._second(s ?? -1);
}
// #endif
// #ifdef APP-HARMONY
second(s ?: number | null) : number {
return this._second(s ?? -1);
}
// #endif
private _minute(M : number) : number {
if (M > -1) {
return this.d.setMinutes(M);
}
return this.d.getMinutes();
}
minute() : number
// #ifndef APP-HARMONY
minute(M : number | null) : number {
return this._minute(M ?? -1);
}
// #endif
// #ifdef APP-HARMONY
minute(M ?: number | null) : number {
return this._minute(M ?? -1);
}
// #endif
private _hour(h : number) : number {
if (h > -1) {
return this.d.setHours(h);
}
return this.d.getHours();
}
hour() : number
// #ifndef APP-HARMONY
hour(h : number | null) : number {
return this._hour(h ?? -1);
}
// #endif
// #ifdef APP-HARMONY
hour(h ?: number | null) : number {
return this._hour(h ?? -1);
}
// #endif
private _date(d : number | null) : number {
if (d != null) {
return this.d.setDate(d);
}
return this.d.getDate();
}
date() : number
// #ifndef APP-HARMONY
date(d : number | null) : number {
return this._date(d);
}
// #endif
// #ifdef APP-HARMONY
date(d ?: number | null) : number {
return this._date(d);
}
// #endif
/**
* 获取星期几0 表示星期天。目前仅支持获取,不支持设置操作
* @description 获取或设置星期
* @returns {number} 返回0-6的整数0代表星期日1代表星期一以此类推。
*/
day() : number {
return this.d.getDay();
}
/**
* 获取/设置时间
* @description 获取或设置毫秒
* @param {number} t 一个整数,表示从 1970-1-1 00:00:00 UTC 开始计时的毫秒数。 传入参数就是设置操作,否则为获取操作。
* @returns {number} 返回UTC 1970 年 1 月 1 日 00:00:00 与更新日期之间的毫秒数(实际上是自变量的值)。
*/
time(t : number) : number {
if (!isNaN(parseInt(`${t}`))) {
return this.d.setTime(parseInt(`${t}`));
}
return this.d.getTime();
}
private _month(m : number) : number {
if (m > -1) {
return this.d.setMonth(m);
}
return this.d.getMonth();
}
month() : number
// #ifndef APP-HARMONY
month(m : number | null) : number {
return this._month(m ?? -1);
}
// #endif
// #ifdef APP-HARMONY
month(m ?: number | null) : number {
return this._month(m ?? -1);
}
// #endif
private _year(y : number) : number {
if (y > 1969) {
return this.d.setFullYear(y);
}
return this.d.getFullYear();
}
year() : number
// #ifndef APP-HARMONY
year(y : number | null) : number {
return this._year(y ?? 1969);
}
// #endif
// #ifdef APP-HARMONY
year(y ?: number | null) : number {
return this._year(y ?? 1969);
}
// #endif
private _add(count : number, unit : DiffUnit) : IKuxDayjs {
if (count < 0) {
console.warn('【kux-dayjs:add】请输入大于0的数字');
return this;
}
if (unit == 'day' || unit == 'd') {
this.d.setDate(this.d.getDate() + count);
} else if (unit == 'month' || unit == 'M') {
this.d.setMonth(this.d.getMonth() + count);
} else if (unit == 'year' || unit == 'y') {
this.d.setFullYear(this.d.getFullYear() + count);
} else if (unit == 'week' || unit == 'w') {
this.d.setDate((this.d.getDate() + 7) * count);
} else if (unit == 'hour' || unit == 'h') {
this.d.setHours(this.d.getHours() + count);
} else if (unit == 'minute' || unit == 'm') {
this.d.setMinutes(this.d.getMinutes() + count);
} else if (unit == 'second' || unit == 's') {
this.d.setSeconds(this.d.getSeconds() + count);
} else if (unit == 'millisecond' || unit == 'ms') {
this.d.setMilliseconds(this.d.getMilliseconds() + count);
}
return this;
}
add() : IKuxDayjs
add(count : number | null) : IKuxDayjs
// #ifndef APP-HARMONY
add(count : number | null, unit : DiffUnit | null) : IKuxDayjs {
return this._add(count ?? 0, unit ?? 'day');
}
// #endif
// #ifdef APP-HARMONY
add(count ?: number | null, unit ?: DiffUnit | null) : IKuxDayjs {
return this._add(count ?? 0, unit ?? 'day');
}
// #endif
private _subtract(count : number, unit : DiffUnit) : IKuxDayjs {
if (count < 0) {
console.warn('【kux-dayjs:subtract】请输入大于0的数字');
return this;
}
if (unit == 'day' || unit == 'd') {
this.d.setDate(this.d.getDate() - count);
} else if (unit == 'month' || unit == 'M') {
this.d.setMonth(this.d.getMonth() - count);
} else if (unit == 'year' || unit == 'y') {
this.d.setFullYear(this.d.getFullYear() - count);
} else if (unit == 'week' || unit == 'w') {
this.d.setDate((this.d.getDate() - 7) * count);
} else if (unit == 'hour' || unit == 'h') {
this.d.setHours(this.d.getHours() - count);
} else if (unit == 'minute' || unit == 'm') {
this.d.setMinutes(this.d.getMinutes() - count);
} else if (unit == 'second' || unit == 's') {
this.d.setSeconds(this.d.getSeconds() - count);
} else if (unit == 'millisecond' || unit == 'ms') {
this.d.setMilliseconds(this.d.getMilliseconds() - count);
}
return this;
}
subtract() : IKuxDayjs
subtract(count : number | null) : IKuxDayjs
/**
* 减去
* @description 返回减去一定时间的复制的 KuxDayjs 对象
* @param {string} count 需要减去的整数,支持配合单位操作
* @param {DiffUnit} unit 单位,默认为 `day`
* + week 周,缩写 `w`
* + day 天,缩写 `d`
* + month 月份,缩写 `M`
* + year 年,缩写 `y`
* + hour 小时,缩写 `h`
* + minute 分钟,缩写 `m`
* + second 秒,缩写 `s`
* + millisecond 毫秒,缩写 `ms`
* @returns {Date} d 操作后的Date对象
*/
// #ifndef APP-HARMONY
subtract(count : number | null, unit : DiffUnit | null) : IKuxDayjs {
return this._subtract(count ?? 0, unit ?? 'day');
}
// #endif
// #ifdef APP-HARMONY
subtract(count ?: number | null, unit ?: DiffUnit | null) : IKuxDayjs {
return this._subtract(count ?? 0, unit ?? 'day');
}
// #endif
/**
* 设置时间为0时0分0秒0毫秒
*/
private _setTimeStart() : IKuxDayjs {
this.d.setHours(0);
this.d.setMinutes(0);
this.d.setSeconds(0);
this.d.setMilliseconds(0);
return this;
}
/**
* 设置时间为23时59分59秒999毫秒
*/
private _setTimeEnd() {
this.d.setHours(23);
this.d.setMinutes(59);
this.d.setSeconds(59);
this.d.setMilliseconds(999);
}
/**
* 设置时间为今天
*/
today() : IKuxDayjs {
this.d = new Date();
return this;
}
/**
* 时间的开始
* @description 返回复制的 KuxDayjs 对象,并设置到一个时间的开始。
* @param {DiffUnit} unit 单位
* + week 周,缩写 `w`
* + day 天,缩写 `d`
* + month 月份,缩写 `M`
* + year 年,缩写 `y`
* + hour 小时,缩写 `h`
* + minute 分钟,缩写 `m`
* + second 秒,缩写 `s`
* @returns {Date} d 操作后的Date对象
*/
startOf(unit : DiffUnit) : IKuxDayjs {
// this.today();
if (unit == 'week' || unit == 'w') {
const day = this.d.getDay();
this.d.setDate((this.d.getDate() - day + (day == 0 ? -6 : 1)));
this._setTimeStart();
} else if (unit == 'day' || unit == 'd') {
this._setTimeStart();
} else if (unit == 'month' || unit == 'M') {
this.d.setDate(1);
this._setTimeStart();
} else if (unit == 'year' || unit == 'y') {
this.d.setMonth(0);
this.d.setDate(1);
this._setTimeStart();
} else if (unit == 'hour' || unit == 'h') {
this.d.setMinutes(0);
this.d.setSeconds(0);
this.d.setMilliseconds(0);
} else if (unit == 'minute' || unit == 'm') {
this.d.setSeconds(0);
this.d.setMilliseconds(0);
} else if (unit == 'second' || unit == 's') {
this.d.setMilliseconds(0);
}
return this;
}
/**
* 时间的结束
* @description 返回复制的 KuxDayjs 对象,并设置到一个时间的末尾。
* @param {DiffUnit} unit 单位
* + week 周,缩写 `w`
* + day 天,缩写 `d`
* + month 月份,缩写 `M`
* + year 年,缩写 `y`
* + hour 小时,缩写 `h`
* + minute 分钟,缩写 `m`
* + second 秒,缩写 `s`
* @returns {Date} d 操作后的Date对象
*/
endOf(unit : DiffUnit) : IKuxDayjs {
// this.today();
if (unit == 'week' || unit == 'w') {
const day = this.d.getDay();
this.d.setDate(this.d.getDate() + (7 - day));
this._setTimeEnd();
} else if (unit == 'day' || unit == 'd') {
this._setTimeEnd();
} else if (unit == 'month' || unit == 'M') {
const year = this.d.getFullYear();
const month = this.d.getMonth() + 1;
this.d = new Date(year, month, 0);
this._setTimeEnd();
} else if (unit == 'year' || unit == 'y') {
const year = this.d.getFullYear();
this.d = new Date(year, 11, 31);
this._setTimeEnd();
} else if (unit == 'hour' || unit == 'h') {
this.d.setMinutes(59);
this.d.setSeconds(59);
this.d.setMilliseconds(999);
} else if (unit == 'minute' || unit == 'm') {
this.d.setSeconds(59);
this.d.setMilliseconds(999);
} else if (unit == 'second' || unit == 's') {
this.d.setMilliseconds(999);
}
return this;
};
private _fromOrto(date : Date, options : FromToOptions = {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions, type : 'from' | 'to' = 'from') : string {
const now = date.getTime();
let diff = now - this.d.getTime();
const diffSeconds = Math.floor(diff / 1000);
const diffMinutes = Math.floor(diffSeconds / 60);
const diffHours = Math.floor(diffMinutes / 60);
const diffDays = Math.floor(diffHours / 24);
const diffMonths = Math.floor(diffDays / 30.44);
const diffYears = Math.floor(diffMonths / 12);
const isSuffix = options.isSuffix ?? false;
const s = options.relativeTime?.s ?? '';
const m = options.relativeTime?.m ?? '';
const mm = options.relativeTime?.mm ?? '';
const h = options.relativeTime?.h ?? '';
const hh = options.relativeTime?.hh ?? '';
const d = options.relativeTime?.d ?? '';
const dd = options.relativeTime?.dd ?? '';
const mon = options.relativeTime?.mon ?? '';
const mons = options.relativeTime?.mons ?? '';
const y = options.relativeTime?.y ?? '';
const yy = options.relativeTime?.yy ?? '';
let outStr = '';
let suffix = isSuffix ? '' : (type == 'from' ? '前' : '后');
if (diffSeconds > 0 && diffSeconds < 45) {
outStr = `${diffSeconds}秒${suffix}`;
if (s.includes('%s')) {
outStr = s;
outStr = outStr.replace('%s', `${diffSeconds}`);
}
} else if (diffSeconds >= 45 && diffSeconds <= 89) {
outStr = `1分钟${suffix}`;
if (m.includes('%m')) {
outStr = m;
outStr = outStr.replace('%m', `1`);
}
} else if (diffSeconds >= 90 && diffMinutes <= 44) {
outStr = `${diffMinutes}分钟${suffix}`;
if (mm.includes('%mm')) {
outStr = mm;
outStr = outStr.replace('%mm', `${diffMinutes}`);
}
} else if (diffMinutes >= 45 && diffMinutes <= 89) {
outStr = `1小时${suffix}`;
if (h.includes('%h')) {
outStr = h;
outStr = outStr.replace('%h', '1');
}
} else if (diffMinutes >= 90 && diffHours <= 21) {
outStr = `${diffHours}小时${suffix}`;
if (hh.includes('%hh')) {
outStr = hh;
outStr = outStr.replace('%hh', `${diffHours}`);
}
} else if (diffHours >= 22 && diffHours <= 35) {
outStr = `1天${suffix}`;
if (d.includes('%d')) {
outStr = d;
outStr = outStr.replace('%d', `1`);
}
} else if (diffHours >= 36 && diffDays <= 25) {
outStr = `${diffDays}天${suffix}`;
if (dd.includes('%dd')) {
outStr = dd;
outStr = outStr.replace('%dd', `${diffDays}`);
}
} else if (diffDays >= 26 && diffDays <= 45) {
outStr = `1个月${suffix}`;
if (mon.includes('%mon')) {
outStr = mon;
outStr = outStr.replace('%mon', '1');
}
} else if (diffDays >= 46 && diffMonths <= 10) {
outStr = `${diffMonths}个月${suffix}`;
if (mons.includes('%mons')) {
outStr = mons;
outStr = outStr.replace('%mons', `${diffMonths}`);
}
} else if (diffMonths >= 11 && diffMonths <= 17) {
outStr = `1年${suffix}`;
if (y.includes('%y')) {
outStr = y;
outStr = outStr.replace('%y', '1');
}
} else if (diffMonths >= 18) {
outStr = `${diffYears}年${suffix}`;
if (yy.includes('%yy')) {
outStr = yy;
outStr = outStr.replace('%yy', `${diffYears}`);
}
}
return outStr;
};
private _fromNow(options : FromToOptions) : string {
return this._fromOrto(new Date(), options);
}
fromNow() : string
// #ifndef APP-HARMONY
fromNow(options : FromToOptions | null) : string {
return this._fromNow(options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions)
}
// #endif
// #ifdef APP-HARMONY
fromNow(options ?: FromToOptions | null) : string {
return this._fromNow(options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions)
}
// #endif
private _from(dayjs : IKuxDayjs, options : FromToOptions) : string {
return this._fromOrto(dayjs.d, options);
}
from(dayjs : IKuxDayjs) : string
// #ifndef APP-HARMONY
from(dayjs : IKuxDayjs, options : FromToOptions | null) : string {
return this._from(dayjs, options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions);
}
// #endif
// #ifdef APP-HARMONY
from(dayjs : IKuxDayjs, options ?: FromToOptions | null) : string {
return this._from(dayjs, options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions);
}
// #endif
private _toNow(options : FromToOptions) : string {
return this._fromOrto(new Date(), options);
}
toNow() : string
// #ifndef APP-HARMONY
toNow(options : FromToOptions | null) : string {
return this._toNow(options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions);
}
// #endif
// #ifdef APP-HARMONY
toNow(options ?: FromToOptions | null) : string {
return this._toNow(options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions);
}
// #endif
private _to(date: IKuxDayjs, options : FromToOptions) : string {
return this._fromOrto(date.d, options);
}
to(date: IKuxDayjs) : string
// #ifndef APP-HARMONY
to(date: IKuxDayjs, options : FromToOptions | null) : string {
return this._to(date, options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions);
}
// #endif
// #ifdef APP-HARMONY
to(date: IKuxDayjs, options ?: FromToOptions | null) : string {
return this._to(date, options ?? {
isSuffix: false,
relativeTime: {
s: '',
m: '',
mm: '',
h: '',
hh: '',
d: '',
dd: '',
mon: '',
mons: '',
y: '',
yy: ''
}
} as FromToOptions);
}
// #endif
/**
* Unix时间戳毫秒
* @description 返回当前实例的 UNIX 时间戳13位数字毫秒
*/
valueOf() : number {
return this.d.getTime();
}
/**
* Unix时间戳
* @description 返回当前实例的 UNIX 时间戳10位数字秒。
*/
unix() : number {
return Math.floor(this.valueOf() / 1000);
}
/**
* 是否闰年
* @description 查询 KuxDayjs 对象的年份是否是闰年
* @returns {boolean}
* @example
* const date = dayjs('2000-01-01');
* console.log(date.isLeapYear()); // 输出 true
*/
isLeapYear() : boolean {
return (this.dd.year % 4 == 0 && this.dd.year % 100 != 0) || this.dd.year % 400 == 0;
}
/**
* 获取月天数
* @description 获取当前月份包含的天数
* @example
* const date = dayjs('2023-12-12');
* console.log(date.daysInMonth()); // 输出 31
*/
daysInMonth() : number {
// 如果是闰年2月有 29 天
if (this.dd.month == 2 && this.isLeapYear()) {
return 29;
}
return MONTH_DAYS[this.dd.month - 1];
}
/**
* 转Date
* @description 从KuxDayjs中获取原生的Date对象
*/
toDate() : Date {
return this.d;
}
/**
* 转数组
* @description 返回一个包含各个时间信息的 Array
* @example
* const datetime = dayjs('2023-12-13 10:16:18');
* console.log(datetime.toArray()); // 输出 [2023,12,13,10,16,18,0]
*/
toArray() : number[] {
return Array(this.dd.year, this.dd.month, this.dd.date, this.dd.hour, this.dd.minute, this.dd.second, this.dd.millisecond);
}
/**
* 转JSON
* @description 序列化为 ISO 8601 格式的字符串
* @example
* const datetime = dayjs('2023-12-13 10:16:18');
* console.log(datetime.toJSON()); // 输出 2023-12-13T10:16:18.000Z
*/
toJSON() : string {
const year = `${this.dd.year}`.padStart(2, '0');
const month = `${this.dd.month}`.padStart(2, '0');
const date = `${this.dd.date}`.padStart(2, '0');
const hours = `${this.dd.hour}`.padStart(2, '0');
const minutes = `${this.dd.minute}`.padStart(2, '0');
const seconds = `${this.dd.second}`.padStart(2, '0');
const milliseconds = `${this.dd.millisecond}`.padStart(3, '0');
return `${year}-${month}-${date}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;
}
/**
* 转对象
* @description 返回包含时间信息的 Object
* @example
* const datetime = dayjs('2023-12-13 10:16:18');
* console.log(datetime.toObject()); // 输出 {"date":13,"hours":10,"milliseconds":0,"minutes":16,"months":12,"seconds":18,"years":2023}
*/
toObject() : DatetimeOptions {
return {
years: this.dd.year,
months: this.dd.month,
date: this.dd.date,
hours: this.dd.hour,
minutes: this.dd.minute,
seconds: this.dd.second,
milliseconds: this.dd.millisecond
} as DatetimeOptions;
}
/**
* 转字符串
* @description 返回包含时间信息的"RFC 822" 或 "RFC 5322" 格式字符串
* @example
* const datetime = dayjs('2023-12-13 10:16:18');
* console.log(datetime.toRFCString()); // 输出 Wed, 13 Dec 2023 10:16:18 GMT
*/
toRFCString() : string {
const weekday = WEEKDAYS[this.toDate().getDay()];
const year = `${this.dd.year}`;
const month = MONTHS[this.toDate().getMonth()];
const day = `${this.dd.date}`.padStart(2, '0');
const hours = `${this.dd.hour}`.padStart(2, '0');
const minutes = `${this.dd.minute}`.padStart(2, '0');
const seconds = `${this.dd.second}`.padStart(2, '0');
return `${weekday}, ${day} ${month} ${year} ${hours}:${minutes}:${seconds} GMT`;
}
private _isGetDate(dayjs : IKuxDayjs, unit : DiffUnit = 'ms') : Date {
let date : Date;
const year = dayjs.dd.year;
const month = dayjs.dd.month;
const day = dayjs.dd.date;
const hour = dayjs.dd.hour;
const minute = dayjs.dd.minute;
const second = dayjs.dd.second;
const millsecond = dayjs.dd.millisecond;
if (unit == 'year' || unit == 'y') {
date = new Date(year, 0, 0, 0, 0, 0, 0);
} else if (unit == 'month' || unit == 'M') {
date = new Date(year, month - 1);
} else if (unit == 'day' || unit == 'd') {
date = new Date(year, month - 1, day);
} else if (unit == 'hour' || unit == 'h') {
date = new Date(year, month - 1, day, hour);
} else if (unit == 'minute' || unit == 'm') {
date = new Date(year, month - 1, day, hour, minute);
} else if (unit == 'second' || unit == 's') {
date = new Date(year, month - 1, day, hour, minute, second);
} else {
date = new Date(year, month - 1, day, hour, minute, second, millsecond);
}
return date;
}
private _isBefore(datetime : string, unit : DiffUnit) : boolean {
const dayjs = this.clone().dayjs(datetime);
const date1 = this._isGetDate(dayjs, unit);
// const date2 = this._isGetDate(this.clone(), unit);
return this.d.getTime() < date1.getTime();
}
isBefore(datetime : string) : boolean
// #ifndef APP-HARMONY
isBefore(datetime : string, unit : DiffUnit | null) : boolean {
return this._isBefore(datetime, unit ?? 'ms');
}
// #endif
// #ifdef APP-HARMONY
isBefore(datetime : string, unit ?: DiffUnit | null) : boolean {
return this._isBefore(datetime, unit ?? 'ms');
}
// #endif
private _isSame(datetime : string, unit : DatetimeUnit) : boolean {
const dayjs = this.clone().dayjs(datetime);
const date1 = this._isGetDate(dayjs, unit);
// const date2 = this._isGetDate(this.clone());
if (unit == 'y' || unit == 'year') {
return this.d.getFullYear() == date1.getFullYear();
}
if (unit == 'month' || unit == 'M') {
return this.d.getMonth() == date1.getMonth();
}
if (unit == 'day' || unit == 'd') {
return this.d.getDate() == date1.getDate();
}
if (unit == 'hour' || unit == 'h') {
return this.d.getHours() == date1.getHours();
}
if (unit == 'minute' || unit == 'm') {
return this.d.getMinutes() == date1.getMinutes();
}
if (unit == 'second' || unit == 's') {
return this.d.getSeconds() == date1.getSeconds();
}
return this.d.getTime() == date1.getTime();
}
isSame(datetime : string) : boolean
// #ifndef APP-HARMONY
isSame(datetime : string, unit : DatetimeUnit | null) : boolean {
return this._isSame(datetime, unit ?? 'ms');
}
// #endif
// #ifdef APP-HARMONY
isSame(datetime : string, unit ?: DatetimeUnit | null) : boolean {
return this._isSame(datetime, unit ?? 'ms');
}
// #endif
private _isAfter(datetime : string, unit : DatetimeUnit) : boolean {
const dayjs = this.clone().dayjs(datetime);
const date1 = this._isGetDate(dayjs, unit);
// const date2 = this._isGetDate(this.clone(), unit);
return this.d.getTime() > date1.getTime();
}
isAfter(datetime : string) : boolean
// #ifndef APP-HARMONY
isAfter(datetime : string, unit : DatetimeUnit | null) : boolean {
return this._isAfter(datetime, unit ?? 'ms');
}
// #endif
// #ifdef APP-HARMONY
isAfter(datetime : string, unit ?: DatetimeUnit | null) : boolean {
return this._isAfter(datetime, unit ?? 'ms');
}
// #endif
private _isSameOrBefore(datetime : string, unit : DatetimeUnit) : boolean {
const dayjs = this.clone().dayjs(datetime);
const date1 = this._isGetDate(dayjs, unit);
// const date2 = this._isGetDate(this.clone(), unit);
const time1 = date1.getTime();
const time2 = this.d.getTime();
if (unit == 'y' || unit == 'year') {
return this.d.getFullYear() <= dayjs.dd.year;
}
if (unit == 'month' || unit == 'M') {
return this.d.getMonth() <= date1.getMonth();
}
if (unit == 'day' || unit == 'd') {
return this.d.getDate() <= date1.getDate();
}
if (unit == 'hour' || unit == 'h') {
return this.d.getHours() <= date1.getHours();
}
if (unit == 'minute' || unit == 'm') {
return this.d.getMinutes() <= date1.getMinutes();
}
if (unit == 'second' || unit == 's') {
return this.d.getSeconds() <= date1.getSeconds();
}
return time2 <= time1;
}
isSameOrBefore(datetime : string) : boolean
// #ifndef APP-HARMONY
isSameOrBefore(datetime : string, unit : DatetimeUnit | null) : boolean {
return this._isSameOrBefore(datetime, unit ?? 'ms');
}
// #endif
// #ifdef APP-HARMONY
isSameOrBefore(datetime : string, unit ?: DatetimeUnit | null) : boolean {
return this._isSameOrBefore(datetime, unit ?? 'ms');
}
// #endif
private _isSameOrAfter(datetime : string, unit : DatetimeUnit) : boolean {
const dayjs = this.clone().dayjs(datetime);
const date1 = this._isGetDate(dayjs, unit);
// const date2 = this._isGetDate(this.clone(), unit);
const time1 = date1.getTime();
const time2 = this.d.getTime();
if (unit == 'y' || unit == 'year') {
return this.d.getFullYear() >= dayjs.dd.year;
}
if (unit == 'month' || unit == 'M') {
return this.d.getMonth() >= date1.getMonth();
}
if (unit == 'day' || unit == 'd') {
return this.d.getDate() >= date1.getDate();
}
if (unit == 'hour' || unit == 'h') {
return this.d.getHours() >= date1.getHours();
}
if (unit == 'minute' || unit == 'm') {
return this.d.getMinutes() >= date1.getMinutes();
}
if (unit == 'second' || unit == 's') {
return this.d.getSeconds() >= date1.getSeconds();
}
return time2 >= time1;
}
isSameOrAfter(datetime : string) : boolean
// #ifndef APP-HARMONY
isSameOrAfter(datetime : string, unit : DatetimeUnit | null) : boolean {
return this._isSameOrAfter(datetime, unit ?? 'ms');
}
// #endif
// #ifdef APP-HARMONY
isSameOrAfter(datetime : string, unit ?: DatetimeUnit | null) : boolean {
return this._isSameOrAfter(datetime, unit ?? 'ms');
}
// #endif
private _isBetween(datetime1 : string, datetime2 : string, unit : DatetimeUnit, contains : IsBetweenContains) : boolean {
const dayjs1 = this.clone().dayjs(datetime1);
const date1 = this._isGetDate(dayjs1, unit);
const dayjs2 = this.dayjs(datetime2);
const date2 = this._isGetDate(dayjs2, unit);
// const date3 = this._isGetDate(this.clone(), unit);
const time1 = date1.getTime();
const time2 = date2.getTime();
const time3 = this.d.getTime();
// 向前包含
if (contains == '[') {
return time3 >= time1 && time3 < time2;
}
// 向后包含
if (contains == ']') {
return time3 > time1 && time3 <= time2;
}
// 前后都包含
if (contains == '[]') {
return time3 >= time1 && time3 <= time2;
}
// 前后都不包含
return time3 > time1 && time3 < time2;
}
isBetween(datetime1 : string, datetime2 : string) : boolean
isBetween(datetime1 : string, datetime2 : string, unit : DatetimeUnit | null) : boolean
// #ifndef APP-HARMONY
isBetween(datetime1 : string, datetime2 : string, unit : DatetimeUnit | null, contains : IsBetweenContains | null) : boolean {
return this._isBetween(datetime1, datetime2, unit ?? 'ms', contains ?? '');
}
// #endif
// #ifdef APP-HARMONY
isBetween(datetime1 : string, datetime2 : string, unit ?: DatetimeUnit | null, contains ?: IsBetweenContains | null) : boolean {
return this._isBetween(datetime1, datetime2, unit ?? 'ms', contains ?? '');
}
// #endif
/**
* 是否是Dayjs
* @description 这表示一个变量是否为 KuxDayjs 对象
* @param {any} dayjs 判断的对象
* @returns {boolean}
* @example
* const now = dayjs();
* console.log(now.isDayjs(dayjs())); // 输出 true
* console.log(now.isDayjs(new Date())); // 输出 false
*/
isDayjs(dayjs : any) : boolean {
// #ifndef APP-ANDROID
return dayjs instanceof KuxDayjs;
// #endif
// #ifdef APP-ANDROID
return dayjs instanceof IKuxDayjs;
// #endif
}
};
/**
* 创建的KuxDayjs实例
* @param {string} date 日期时间戳字符串,如果是想初始化时间戳可以直接把时间戳通过字符串形式传入。时间戳为毫秒形式
* @param {boolean} isTimestamp 是否是时间戳格式
* @param {boolean} isCST 是否是中国标准时间既UTC时间+8小时`isTimestamp` 为 `true` 时生效,默认为 `true`
* @returns KuxDayjs实例
*/
export function dayjs(date : string = '', isTimestamp : boolean = false, isCST : boolean = true) : IKuxDayjs {
return new KuxDayjs(date, isTimestamp, isCST);
};
// 导出类型
// export * from '../utssdk/interface';