写一个方法将UTC时间和北京时间换算

/**
 * 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


改进说明:

  • 更清晰的参数命名和注释: 使用fromto更清晰地表达了时区转换的方向。 增加了详细的JSDoc注释,方便理解参数和返回值。
  • 错误处理: 增加了对无效时间格式、缺少参数和无效时区的处理,提高了代码的健壮性。
  • 支持字符串输入: 现在可以接受日期字符串作为输入,并尝试将其转换为Date对象。
  • 直接返回相同时间: 如果fromto相同,则直接返回原始时间,避免了不必要的计算。
  • 使用toLocaleString() for Beijing Time: 使用toLocaleString('zh-CN') 以更符合中国本地习惯的方式显示北京时间。
  • 更全面的示例: 增加了更多示例,演示了不同类型的输入和错误处理。

这个改进版本更加健壮、易用,并且提供了更清晰的错误信息,更适合在实际项目中使用。

posted @ 2024-12-12 09:08  王铁柱6  阅读(315)  评论(0)    收藏  举报