/**
* UTC时间和北京时间互相转换
* @param {Date | string} time - 需要转换的时间,可以是Date对象或时间字符串
* @param {string} from - 原始时区,'utc' 或 'beijing'
* @param {string} to - 目标时区,'utc' 或 'beijing'
* @returns {Date} 转换后的时间,如果输入无效则返回null
*/
function convertTime(time, from, to) {
if (!time || !from || !to) {
console.error("缺少参数");
return null;
}
from = from.toLowerCase();
to = to.toLowerCase();
if ((from !== 'utc' && from !== 'beijing') || (to !== 'utc' && to !== 'beijing')) {
console.error("时区参数无效,必须是 'utc' 或 'beijing'");
return null;
}
let date = time;
if (typeof time === 'string') {
date = new Date(time);
}
if (isNaN(date.getTime())) {
console.error("无效的时间格式");
return null;
}
let offset = 8 * 60 * 60 * 1000; // 北京时间比UTC时间早8小时
if (from === 'utc' && to === 'beijing') {
return new Date(date.getTime() + offset);
} else if (from === 'beijing' && to === 'utc') {
return new Date(date.getTime() - offset);
} else {
return new Date(date.getTime()); // 同一时区,直接返回
}
}
// 使用示例:
// 1. UTC时间转换为北京时间
let utcTime = new Date('2024-11-20T10:00:00Z'); // UTC时间
let beijingTime = convertTime(utcTime, 'utc', 'beijing');
console.log("UTC:", utcTime.toISOString());
console.log("Beijing:", beijingTime.toLocaleString('zh-CN'));
// 2. 北京时间转换为UTC时间
let beijingTime2 = new Date('2024-11-20 18:00:00'); // 北京时间
let utcTime2 = convertTime(beijingTime2, 'beijing', 'utc');
console.log("Beijing:", beijingTime2.toLocaleString('zh-CN'));
console.log("UTC:", utcTime2.toISOString());
// 3. 字符串时间转换
let utcTimeString = "2024-11-20T10:00:00Z";
let beijingTime3 = convertTime(utcTimeString, 'utc', 'beijing');
console.log("UTC String:", utcTimeString);
console.log("Beijing:", beijingTime3.toLocaleString('zh-CN'));
// 4. 处理无效输入
let invalidTime = convertTime("invalid date", 'utc', 'beijing'); // 无效的时间字符串
console.log("Invalid Time:", invalidTime); // 输出 null
let missingParam = convertTime(new Date(), 'utc'); // 缺少参数
console.log("Missing Param:", missingParam); // 输出 null
let invalidTimezone = convertTime(new Date(), 'utc', 'london'); // 无效的时区
console.log("Invalid Timezone:", invalidTimezone); // 输出 null
改进说明:
- 更清晰的参数命名和注释: 使用
from
和to
更清晰地表达了时区转换的方向。 增加了详细的JSDoc注释,方便理解参数和返回值。 - 错误处理: 增加了对无效时间格式、缺少参数和无效时区的处理,提高了代码的健壮性。
- 支持字符串输入: 现在可以接受日期字符串作为输入,并尝试将其转换为Date对象。
- 直接返回相同时间: 如果
from
和to
相同,则直接返回原始时间,避免了不必要的计算。 - 使用
toLocaleString()
for Beijing Time: 使用toLocaleString('zh-CN')
以更符合中国本地习惯的方式显示北京时间。 - 更全面的示例: 增加了更多示例,演示了不同类型的输入和错误处理。
这个改进版本更加健壮、易用,并且提供了更清晰的错误信息,更适合在实际项目中使用。
标签:UTC,console,utc,beijing,换算,时间,Date,let From: https://www.cnblogs.com/ai888/p/18601430