@tencentcloud/roomkit-electron-vue3
Version:
<h1 align="center"> TUIRoomKit</h1> Conference (TUIRoomKit) is a product suitable for multi-person audio and video conversation scenarios such as business meetings, webinars, and online education. By integrating this product, you can add room management,
133 lines (114 loc) • 4.07 kB
text/typescript
// scheduleUtils.ts`
import { isWeChat } from '../../utils/environment';
export interface DateAndTimeResult {
date: Date;
laterTime: string;
time: string;
}
// 手动格式化日期和时间的函数
const formatDateTime = (date: Date): string => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hour = String(date.getHours()).padStart(2, '0');
const minute = String(date.getMinutes()).padStart(2, '0');
return `${month}/${day}/${year}, ${hour}:${minute}`;
};
export const getDateAndTime = (
date: Date,
timeZone?: string
): DateAndTimeResult => {
let formattedDate;
let currentTimeZone = timeZone;
if (isWeChat) {
formattedDate = formatDateTime(date);
} else {
if (!timeZone) {
currentTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
}
// in other environment use Intl.DateTimeFormat
const formatter = new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
hour12: false, // Use 24-hour format
currentTimeZone,
} as any); // Intl is not supported in the Android mini-program environment, so use any
formattedDate = formatter.format(date);
}
const [month, day, year, hour, minute] = formattedDate
.split(/[\s,:/]+/)
.filter(part => part !== 'AM' && part !== 'PM');
// Round minutes up to the nearest multiple of 15 (00, 15, 30, or 45)
const roundedMinute = Math.ceil(parseInt(minute) / 15) * 15;
// If the rounded minute is 60, increment the hour and set the minute to 00
const adjustedHour =
roundedMinute === 60 ? parseInt(hour) + 1 : parseInt(hour);
const adjustedMinute = roundedMinute === 60 ? 0 : roundedMinute;
// Create a new date object with the adjusted hour and minute
const adjustedDate = new Date(
parseInt(year),
parseInt(month) - 1,
parseInt(day),
adjustedHour,
adjustedMinute
);
// If the adjusted date is earlier than the current date, add 15 minutes
if (adjustedDate < date) {
adjustedDate.setMinutes(adjustedDate.getMinutes() + 15);
}
const intHour = parseInt(hour);
const intMinute = parseInt(minute);
return {
date: new Date(parseInt(year), parseInt(month) - 1, parseInt(day)),
laterTime: `${adjustedHour < 10 ? `0${adjustedHour}` : adjustedHour}:${
adjustedMinute < 10 ? `0${adjustedMinute}` : adjustedMinute
}`,
time: `${intHour < 10 ? `0${intHour}` : intHour}:${intMinute < 10 ? `0${intMinute}` : intMinute}`,
};
};
export const convertToTimestamp = (
date: Date,
time: string,
timezone: string,
offset: 1 | -1 = 1,
referenceTimezone?: string
) => {
const year = date.getFullYear();
const month = date.getMonth();
const day = date.getDate();
// Split time string into hours and minutes
const [hour, minute] = time.split(':').map(Number);
// Create a new date object with the given year, month, day, hour, and minute
const dateTime = new Date(year, month, day, hour, minute);
const timezoneOffset =
offset * getTimezoneOffset(timezone, referenceTimezone) * 60 * 1000;
return dateTime.getTime() - timezoneOffset;
};
export const calculateEndTime = (startTime: number, duration: number) => {
const endTime = startTime + duration * 1000;
return endTime;
};
export function getTimezoneOffset(
targetTimezone: string,
referenceTimezone = 'UTC'
) {
const now = Date.now();
const referenceDate =
referenceTimezone === 'UTC'
? new Date(now).toISOString()
: new Date(now).toLocaleString('en-US', {
timeZone: referenceTimezone,
hour12: false,
});
const targetDate = new Date(now).toLocaleString('en-US', {
timeZone: targetTimezone,
hour12: false,
});
const referenceTime = new Date(referenceDate).getTime();
const targetTime = new Date(targetDate).getTime();
const offset = Math.round((targetTime - referenceTime) / (1000 * 60));
return offset;
}