需求背景
公司里经常会有一些国际化的业务场景。比如:用户他是中国人,去了美国。在去美国之前呢,下了一个订单。收货地址是:密西西比(要求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`;
};