@arco-design/web-react
Version:
Arco Design React UI Library.
318 lines (317 loc) • 12 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
import originDayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';
import isBetween from 'dayjs/plugin/isBetween';
import weekOfYear from 'dayjs/plugin/weekOfYear';
import AdvancedFormat from 'dayjs/plugin/advancedFormat';
import weekYear from 'dayjs/plugin/weekYear';
import QuarterOfYear from 'dayjs/plugin/quarterOfYear';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
import { isDayjs, isArray, isUndefined } from '../_util/is';
var isMoment = originDayjs()._isAMomentObject;
if (isMoment) {
originDayjs.extend = function () { };
}
var overwriteIsDayjs = function (_, Dayjs, dayjs) {
dayjs = function (date, c) {
if (isDayjs(date)) {
return date.clone();
}
var cfg = typeof c === 'object' ? c : {};
cfg.date = date;
cfg.args = arguments; // eslint-disable-line prefer-rest-params
return new Dayjs(cfg);
};
var proto = Dayjs.prototype;
var old$Utils = proto.$utils;
proto.$utils = function () {
var newUtils = old$Utils();
newUtils.i = isDayjs;
return newUtils;
};
dayjs.isDayjs = isDayjs;
};
originDayjs.extend(overwriteIsDayjs);
originDayjs.extend(customParseFormat);
originDayjs.extend(isBetween);
originDayjs.extend(weekOfYear);
originDayjs.extend(AdvancedFormat);
originDayjs.extend(weekYear);
originDayjs.extend(QuarterOfYear);
originDayjs.extend(utc);
originDayjs.extend(timezone);
export var dayjs = originDayjs;
function startOfWeekTimestamp(date, weekStart) {
// 计算 date 与前一个 weekStart 日期的间隔
var diff = (date.day() - weekStart + 7) % 7;
var startOfWeek = date.clone().startOf('day').subtract(diff, 'day');
return startOfWeek.valueOf();
}
function isSameWeekMoment(date1, date2, weekStart) {
return startOfWeekTimestamp(date1, weekStart) === startOfWeekTimestamp(date2, weekStart);
}
// 兼容 moment
export var methods = {
add: function (time, value, unit) {
return isMoment ? time.clone().add(value, unit) : time.add(value, unit);
},
subtract: function (time, value, unit) {
return isMoment ? time.clone().subtract(value, unit) : time.subtract(value, unit);
},
startOf: function (time, unit) {
return isMoment ? time.clone().startOf(unit) : time.startOf(unit);
},
endOf: function (time, unit) {
return isMoment ? time.clone().endOf(unit) : time.endOf(unit);
},
set: function (time, unit, value) {
return isMoment ? time.clone().set(unit, value) : time.set(unit, value);
},
isSameWeek: function (date1, date2, weekStart, localeName) {
return isMoment
? isSameWeekMoment(date1, date2, weekStart)
: date1.locale(__assign(__assign({}, dayjs.Ls[localeName]), { weekStart: weekStart })).isSame(date2, 'week');
},
};
// convert timezone to utcOffset
// https://github.com/iamkun/dayjs/blob/dev/src/plugin/timezone/index.js#L3
var typeToPos = {
year: 0,
month: 1,
day: 2,
hour: 3,
minute: 4,
second: 5,
};
// Cache time-zone lookups from Intl.DateTimeFormat,
// as it is a *very* slow method.
var dtfCache = {};
var getDateTimeFormat = function (timezone, timeZoneName) {
var key = timezone + "|" + (timeZoneName || 'short');
var dtf = dtfCache[key];
if (!dtf) {
dtf = new Intl.DateTimeFormat('en-US', {
hour12: false,
timeZone: timezone,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
});
dtfCache[key] = dtf;
}
return dtf;
};
var makeFormatParts = function (timestamp, timezone) {
var date = new Date(timestamp);
var dtf = getDateTimeFormat(timezone);
return dtf.formatToParts(date);
};
var tzOffset = function (timestamp, timezone) {
var formatResult = makeFormatParts(timestamp, timezone);
var filled = [];
for (var i = 0; i < formatResult.length; i += 1) {
var _a = formatResult[i], type = _a.type, value = _a.value;
var pos = typeToPos[type];
if (pos >= 0) {
filled[pos] = parseInt(value, 10);
}
}
var hour = filled[3];
// Workaround for the same behavior in different node version
// https://github.com/nodejs/node/issues/33027
/* istanbul ignore next */
var fixedHour = hour === 24 ? 0 : hour;
var utcTs = Date.UTC(filled[0], filled[1] - 1, filled[2], fixedHour, filled[4], filled[5], 0);
var asTS = +timestamp;
var over = asTS % 1000;
asTS -= over;
return (utcTs - asTS) / (60 * 1000);
};
// find the right offset a given local time. The o input is our guess, which determines which
// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)
// https://github.com/moment/luxon/blob/master/src/datetime.js#L76
var fixOffset = function (localTS, o0, tz) {
// Our UTC time is just a guess because our offset is just a guess
var utcGuess = localTS - o0 * 60 * 1000;
// Test whether the zone matches the offset for this ts
var o2 = tzOffset(utcGuess, tz);
// If so, offset didn't change and we're done
if (o0 === o2) {
return [utcGuess, o0];
}
// If not, change the ts by the difference in the offset
utcGuess -= (o2 - o0) * 60 * 1000;
// If that gives us the local time we want, we're done
var o3 = tzOffset(utcGuess, tz);
if (o2 === o3) {
return [utcGuess, o2];
}
// If it's different, we're in a hole time.
// The offset has changed, but the we don't adjust the time
return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];
};
export function timezoneToOffset(inputTs, timezone) {
// 使用输入时间戳获取初始偏移量猜测
var initialOffset = tzOffset(inputTs, timezone);
return fixOffset(inputTs, initialOffset, timezone)[1];
}
// get local now time
export function getNow(utcOffset, timezone) {
return isUndefined(utcOffset) && !timezone ? dayjs() : toTimezone(dayjs(), utcOffset, timezone);
}
// convert local date to specify timezone date
export function toTimezone(time, utcOffset, timezone, local) {
if (!time || (isUndefined(utcOffset) && !timezone)) {
return time;
}
var localOffset = -time.toDate().getTimezoneOffset();
var uOffset = isUndefined(utcOffset)
? !timezone
? localOffset
: timezoneToOffset(time.valueOf(), timezone)
: utcOffset;
var timezoneOffset = Math.abs(uOffset) <= 16 ? uOffset * 60 : uOffset;
var diffOffset = local ? localOffset - timezoneOffset : timezoneOffset - localOffset;
// 由于内部时区是手动计算,所以看转换后的时间是否经历冬令时和夏令时边界,做下微调,修正拨表的一个小时
var fixOffset = timezone
? timezoneToOffset(dayjs(time).valueOf() + diffOffset * 60 * 1000, timezone)
: uOffset;
var realDiffOffset = diffOffset - (uOffset - fixOffset);
var diff = local || !isUndefined(utcOffset) ? diffOffset : realDiffOffset;
return dayjs(dayjs(time).valueOf() + diff * 60 * 1000);
}
// convert specify timezone date to local date
export function toLocal(time, utcOffset, timezone) {
return toTimezone(time, utcOffset, timezone, true);
}
export function getTimeFormat(format) {
var units = ['H', 'h', 'm', 's', 'A', 'a'];
var timeFormat = '';
units.some(function (unit) {
if (format.indexOf(unit) !== -1) {
timeFormat = "" + unit + format.split(" " + unit)[1];
return true;
}
return false;
});
return timeFormat || 'HH:mm:ss';
}
export function getDayjsValue(time, format, utcOffset, timezone) {
if (!time) {
return undefined;
}
var formatValue = function (value, i) {
if (isDayjs(value)) {
return dayjs(value.valueOf());
}
if (typeof value === 'string') {
var dv = dayjs(value, isArray(format) ? format[i] : format);
return dv.isValid() ? dv : dayjs(value, 'YYYY-MM-DD');
}
return dayjs(value);
};
// if set a timezone, convert to timezone date
var getRealTime = function (t, i) {
return utcOffset !== undefined || timezone
? toTimezone(formatValue(t, i), utcOffset, timezone)
: formatValue(t, i);
};
if (isArray(time)) {
return time.map(function (t, i) { return (t ? getRealTime(t, i) : undefined); });
}
return getRealTime(time, 0);
}
export function getValueWithTime(date, time) {
var y = date.year();
var m = date.month();
var d = date.date();
if (time) {
var returnTime = time;
returnTime = methods.set(returnTime, 'year', y);
returnTime = methods.set(returnTime, 'month', m);
returnTime = methods.set(returnTime, 'date', d);
return returnTime;
}
return date;
}
export function getSortedDayjsArray(values, fixedTime) {
if (!values || !values[0] || !values[1]) {
return values;
}
var newValues = __spreadArray([], __read(values), false);
newValues.sort(function (a, b) { return a.valueOf() - b.valueOf(); });
// 排序处理考虑时间
if (fixedTime && values.length === 2) {
newValues[0] = newValues[0]
.set('hour', values[0].get('hour'))
.set('minute', values[0].get('minute'))
.set('second', values[0].get('second'));
newValues[1] = newValues[1]
.set('hour', values[1].get('hour'))
.set('minute', values[1].get('minute'))
.set('second', values[1].get('second'));
}
return newValues;
}
export function isDayjsChange(prevValue, currentValue) {
if (currentValue === undefined && prevValue === undefined) {
return false;
}
return ((currentValue && !prevValue) ||
(!currentValue && prevValue) ||
dayjs(currentValue).valueOf() !== dayjs(prevValue).valueOf());
}
export function isDayjsArrayChange(prevValue, currentValue) {
if (currentValue === undefined && prevValue === undefined) {
return false;
}
return ((currentValue && !prevValue) ||
(!currentValue && prevValue) ||
(isArray(currentValue) &&
isArray(prevValue) &&
dayjs(currentValue[0]).valueOf() !== dayjs(prevValue[0]).valueOf()) ||
dayjs(currentValue[1]).valueOf() !== dayjs(prevValue[1]).valueOf());
}
export function isValidTimeString(str, format, index) {
return (typeof str === 'string' &&
dayjs(str, format).format(isArray(format) ? format[index] : format) === str);
}