stonev5-utils
Version:
all my utils here
158 lines • 5.64 kB
JavaScript
/**
* 获取当前时间
* @param deltaSecs 时间偏移量,单位秒
* @param date 基准日期
* @param offsetHours null为本地时间。 时区偏移量,单位小时, 北京时间为 +8
* @returns
*/
export function getDate(deltaSecs, date, offsetHours) {
if (date == null) {
date = new Date();
}
else {
date = new Date(date); // 确保不修改原始日期对象
}
if (deltaSecs == null)
deltaSecs = 0;
if (offsetHours == null) {
if (deltaSecs == 0) {
// 如果没有偏移量,直接返回当前时间
return date;
}
else {
// 如果没有时区偏移量,直接返回当前时间加上偏移量
return new Date(date.getTime() + deltaSecs * 1000);
}
}
else {
offsetHours = -offsetHours; // 内部计算是 utc-offset,所以这里需要取反
const ms = date.getTime(); // 获取当前时间的毫秒数
let tms = ms + date.getTimezoneOffset() * 60 * 1000; // 将本地时间转换为 UTC ms
tms -= offsetHours * 60 * 60 * 1000; // 将 UTC ms 时间转换为目标时区时间的 ms
if (tms != ms) {
date = new Date(tms + deltaSecs * 1000); // 将目标时区时间的 ms 加上偏移量
}
else {
if (deltaSecs != 0) {
date = new Date(ms + deltaSecs * 1000); // 如果没有时区偏移量,直接返回当前时间加上偏移量
}
}
return date;
}
}
/**
* 获取当前日期时间组件
* @param deltaSecs 时间偏移量,单位秒
* @param date 基准日期
* @param offsetHours 时区偏移量,单位小时
* @returns
*/
export function getCurrentDateTimeComponents(deltaSecs, date, offsetHours) {
date = getDate(deltaSecs, date, offsetHours);
const year = date.getFullYear().toString();
const month = (date.getMonth() + 1); // Month value needs +1 as it starts from 0.
const day = date.getDate();
const hours = date.getHours();
const minutes = date.getMinutes();
const seconds = date.getSeconds();
return {
year,
month, monthPad: month.toString().padStart(2, "0"),
day, dayPad: day.toString().padStart(2, "0"),
hours, hoursPad: hours.toString().padStart(2, "0"),
minutes, minutesPad: minutes.toString().padStart(2, "0"),
seconds, secondsPad: seconds.toString().padStart(2, "0"),
};
}
/**
* 格式化日期为字符串 2021-01-01 00:00:00
* @param date 日期
* @returns 格式化后的日期字符串
*/
export function formatDate(deltaSecs, date, offsetHours) {
const { year, monthPad, dayPad, hoursPad, minutesPad, secondsPad } = getCurrentDateTimeComponents(deltaSecs, date, offsetHours);
return year + "-" + monthPad + "-" + dayPad + " " + hoursPad + ":" + minutesPad + ":" + secondsPad;
}
/**
* 格式化日期为字符串 20210101000000
* @param date 日期
* @returns 格式化后的日期字符串
*/
export function formatDateYYYYMMDDHHmmss(deltaSecs, date, offsetHours) {
const { year, monthPad, dayPad, hoursPad, minutesPad, secondsPad } = getCurrentDateTimeComponents(deltaSecs, date, offsetHours);
return year + monthPad + dayPad + hoursPad + minutesPad + secondsPad;
}
/**
* 获取日期中的天
* @param date 日期
* @returns 格式化后的日期字符串
*/
export function getDayStr(deltaSecs, date, offsetHours) {
const { year, monthPad, dayPad } = getCurrentDateTimeComponents(deltaSecs, date, offsetHours);
return `${year}-${monthPad}-${dayPad};`;
}
/**
* 获取日期中的时间
* @param date 日期
* @returns 格式化后的日期字符串
*/
export function getTimeStr(deltaSecs, date, offsetHours) {
const { hoursPad, minutesPad, secondsPad } = getCurrentDateTimeComponents(deltaSecs, date, offsetHours);
return `${hoursPad}:${minutesPad}:${secondsPad}`;
}
/**
* 从字符串 中获取日期
* @param dateStr 日期字符串: YYYYMMDDHHmmss
* @returns 日期
*/
export function getDateFromYYYYMMDDHHmmss(dateStr) {
const year = dateStr.slice(0, 4);
const month = dateStr.slice(4, 6);
const day = dateStr.slice(6, 8);
const hours = dateStr.slice(8, 10);
const minutes = dateStr.slice(10, 12);
const seconds = dateStr.slice(12);
return new Date(`${year}-${month}-${day} ${hours}:${minutes}:${seconds}`);
}
export function convertMinutesToTimeFormat(minutes) {
const hours = Math.floor(minutes / 60);
const remainingMinutes = minutes % 60;
if (hours == 0) {
return `${remainingMinutes}m`;
}
return `${hours}h${remainingMinutes}m`;
}
export function setTimeouts(cb, start, end, step) {
for (; start <= end; start += step) {
setTimeout(cb, start);
}
}
export function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
export function readableDuration(secs, partLen = 10) {
if (secs <= 0)
return '0s';
const units = [
{ name: 'y', seconds: 365 * 24 * 60 * 60 },
{ name: 'd', seconds: 24 * 60 * 60 },
{ name: 'h', seconds: 60 * 60 },
{ name: 'm', seconds: 60 },
{ name: 's', seconds: 1 }
];
let remaining = Math.floor(secs);
const parts = [];
for (const unit of units) {
if (remaining <= 0)
break;
const value = Math.floor(remaining / unit.seconds);
if (value > 0) {
parts.push(`${value}${unit.name}`);
remaining -= value * unit.seconds;
}
}
return parts.slice(0, partLen).join(' ');
}
//# sourceMappingURL=time.js.map