通过new Date() 时区实现 国外时间转换为北京时间

1,043 阅读2分钟

需求背景

公司里经常会有一些国际化的业务场景。比如:用户他是中国人,去了美国。在去美国之前呢,下了一个订单。收货地址是:密西西比(要求3月8日前完成取货)。用户在3月3日从中国起飞,次日降落美国。但是当用户在3月8日去取货时发现,货物已经不在了。就开始问客服工作人员,用户:为什么我的货不在了捏?不是说好了是3月8号吗。客服:你个叼毛 今天3月9号了哦。用户:???。

针对以上国际化应用场景,临时,紧急添加了一个需求。需要在用户进入订单时,展示用户当地时间和北京时间。不和用户扯皮。(开干)

代码时间

需求分析:

用户所在地(未知 不确定)。

用户需要转换的时间:北京时间/HK时间(是同一个时间)。

攻克要点:

得知用户究竟在哪。(用最简单的方式来实现 new Date() 时区,测试起来也方便)

用户所在地的时区转换成北京时间。

const isBJ = () => {
  // 获取当前时间的时区
  const currentTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;

  // 判断时区是否在中国内地或港澳台地区
  if (currentTimeZone === 'Asia/Shanghai'
    || currentTimeZone === 'Asia/Chongqing'
    || currentTimeZone === 'Asia/Harbin'
    || currentTimeZone === 'Asia/Kashgar'
    || currentTimeZone === 'Asia/Urumqi'
    || currentTimeZone === 'Asia/Hong_Kong'
    || currentTimeZone === 'Asia/Taipei'
    || currentTimeZone === 'Asia/Macau') {
    return true;
  }
  return false;
};
function getHkTime() {
  // 获取用户当前时间
  const userTime = new Date();

  // 将用户本地时间转换为香港时间字符串
  const hongKongTimeString = userTime.toLocaleString('en-US', {
    timeZone: 'Asia/Hong_Kong',
    hour12: false, // 将小时格式设置为24小时制,以避免出现12小时制与24小时制的混淆
  });

  // 将香港时间字符串转换为 Date 对象
  const hongKongTime = new Date(hongKongTimeString);

  return {
    local: userTime,
    hk: hongKongTime,
  };
}

const transformTime = () => {
  const { hk, local } = getHkTime();
  const nowStr = moment(local).format('MM-DD HH:mm');
  const hkt = moment(hk);
  const str = hkt.format('MM-DD HH:mm');
  // 在中国境内 返回本地时间即可 否则 返回本地时间 和 北京时间
   if (isBJ()) {
      return `${nowStr}\n`;
    }
    return `${nowStr}(${str} HK)\n`;
};