change: replace date controller of Scheduler.
feature: `ui.formatDate` supports formatter. fix: issue about boolean sort.
This commit is contained in:
154
lib/ui/date.js
154
lib/ui/date.js
@ -45,6 +45,129 @@ export function toDateValue(dt, local) {
|
||||
return `${year}-${month}-${date}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {Date} date
|
||||
* @param {boolean} [utc=true]
|
||||
* @returns {string}
|
||||
*/
|
||||
function getFormatter(date, utc) {
|
||||
const prefix = utc !== false ? 'getUTC' : 'get';
|
||||
const r = {
|
||||
/**
|
||||
* @private
|
||||
* @returns {number} 返回日数字
|
||||
*/
|
||||
j: () => date[`${prefix}Date`](),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回格式化成两位的日字符串
|
||||
*/
|
||||
d: () => String(r.j()).padStart(2, '0'),
|
||||
/**
|
||||
* @private
|
||||
* @returns {number} 返回月数字
|
||||
*/
|
||||
n: () => date[`${prefix}Month`]() + 1,
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回格式化成两位的月字符串
|
||||
*/
|
||||
m: () => String(r.n()).padStart(2, '0'),
|
||||
/**
|
||||
* @private
|
||||
* @returns {number} 返回年数字
|
||||
*/
|
||||
Y: () => date[`${prefix}FullYear`](),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回年后两位
|
||||
*/
|
||||
y: () => String(r.Y()).slice(-2),
|
||||
/**
|
||||
* @private
|
||||
* @returns {number} 返回日期当月总天数
|
||||
*/
|
||||
t: () => new Date(r.Y(), r.n(), 0).getDate(),
|
||||
/**
|
||||
* @private
|
||||
* @returns {('1' | '0')} 返回是否为闰年
|
||||
*/
|
||||
L() {
|
||||
const y = r.Y();
|
||||
return t % 4 === 0 && t % 100 !== 0 || t % 400 === 0 ? 1 : 0;
|
||||
},
|
||||
/**
|
||||
* @private
|
||||
* @returns {number} 返回小时数字
|
||||
*/
|
||||
G: () => date[`${prefix}Hours`](),
|
||||
/**
|
||||
* @private
|
||||
* @returns {number} 返回 12 小时制的数字
|
||||
*/
|
||||
g: () => r.G() % 12 || 12,
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回格式化成两位的小时字符串
|
||||
*/
|
||||
H: () => String(r.G()).padStart(2, '0'),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回格式化成两位的 12 小时制的字符串
|
||||
*/
|
||||
h: () => String(r.g()).padStart(2, '0'),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回上下午
|
||||
*/
|
||||
A: () => ['AM', 'PM'][r.G() < 12 ? 0 : 1],
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回小写的上下午
|
||||
*/
|
||||
a: () => r.A().toLowerCase(),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回格式化成两位的分钟字符串
|
||||
*/
|
||||
i: () => String(date[`${prefix}Minutes`]()).padStart(2, '0'),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回格式化成两位的秒字符串
|
||||
*/
|
||||
s: () => String(date[`${prefix}Seconds`]()).padStart(2, '0'),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回格式化成六位的毫秒字符串
|
||||
*/
|
||||
u: () => String(1e3 * date[`${prefix}Milliseconds`]()).padStart(6, '0'),
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回时区描述字符串
|
||||
*/
|
||||
e: () => /\((.*)\)/.exec(String(date))[1] || 'Coordinated Universal Time',
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回时区偏移字符串
|
||||
*/
|
||||
O() {
|
||||
const t = date.getTimezoneOffset();
|
||||
const r = Math.abs(t);
|
||||
return (t > 0 ? '-' : '+') + String(100 * Math.floor(r / 60) + r % 60).padStart(4, '0');
|
||||
},
|
||||
/**
|
||||
* @private
|
||||
* @returns {string} 返回 +08:00 这种格式的时区偏移字符串
|
||||
*/
|
||||
P() {
|
||||
const t = r.O();
|
||||
return t.substring(0, 3) + ':' + t.substring(3, 5);
|
||||
}
|
||||
};
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化日期为 M/d/yyyy 格式的字符串
|
||||
* @param {Date | number | string} date - 需要格式化的日期值,支持的格式如下:
|
||||
@ -54,16 +177,41 @@ export function toDateValue(dt, local) {
|
||||
* * `"1/26/2024"`
|
||||
* * `"638418240000000000"`
|
||||
* * `new Date('2024-01-26')`
|
||||
* @param {string} [formatter] - 格式化格式,默认为 `"m/d/Y"`
|
||||
*
|
||||
* * Y - 年,例如 `2024`
|
||||
* * y - 年的后两位,例如 `"24"`
|
||||
* * n - 月,例如 `2`
|
||||
* * m - 格式化成两位的月,例如 `"02"`
|
||||
* * j - 日,例如 `4`
|
||||
* * d - 格式化成两位的日,例如 `"04"`
|
||||
* * t - 日期当月总天数,例如 `29`
|
||||
* * L - 是否为闰年,例如 `1`
|
||||
* * G - 小时,例如 `15`
|
||||
* * g - 12 小时制的小时,例如 `3`
|
||||
* * H - 格式化成两位的小时,例如 `"15"`
|
||||
* * h - 格式化成两位的 12 小时制的小时,例如 `"03"`
|
||||
* * A - 上下午,例如 `"PM"`
|
||||
* * a - 小写的上下午,例如 `"pm"`
|
||||
* * i - 格式化成两位的分钟,例如 `"39"`
|
||||
* * s - 格式化成两位的秒,例如 `"20"`
|
||||
* * u - 格式化成六位的毫秒,例如 `"023040"`
|
||||
* * e - 时区描述字符串,例如 `"China Standard Time"`
|
||||
* * O - 时区偏移字符串,例如 `"+0800"`
|
||||
* * P - `"+08:00"` 这种格式的时区偏移字符串
|
||||
* @returns {string} 返回格式化后的日期字符串
|
||||
*/
|
||||
export function formatDate(date) {
|
||||
export function formatDate(date, formatter) {
|
||||
formatter ??= 'm/d/Y';
|
||||
if (date instanceof Date) {
|
||||
return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`;
|
||||
const f = getFormatter(date, false);
|
||||
return formatter.replace(/\\?(.?)/gi, (k, v) => f[k] ? f[k]() : v);
|
||||
}
|
||||
const ticks = Number(date);
|
||||
if (!isNaN(ticks) && ticks > 0) {
|
||||
date = new Date((ticks - 621355968e9) / 1e4);
|
||||
return `${date.getUTCMonth() + 1}/${date.getUTCDate()}/${date.getUTCFullYear()}`;
|
||||
const f = getFormatter(date);
|
||||
return formatter.replace(/\\?(.?)/gi, (k, v) => f[k] ? f[k]() : v);
|
||||
}
|
||||
return date;
|
||||
}
|
||||
|
Reference in New Issue
Block a user