国际化相关参数
- region 国家
- timezone 时区 “Asia/Shanghai”
- 是为解决地球自转导致的不同地区时间差异而设定的标准化时间体系,核心是让同一时刻不同经度的地区,根据当地日出日落规律使用 “相对统一” 的时间。
- 时区的关键基准:UTC(协调世界时)
- 时区表示为 “UTC±X”:如东 8 区 = UTC+8,西 5 区 = UTC-5
- langCode 语言代码 (language code,更准确地说是 locale 标识符)用于指定本地化规则
- 例如: “de-DE”
- “de” 是 语言代码,代表 “德语”(German);
- “DE” 是 地区代码,代表 “德国”(Germany);
- 组合起来 “de-DE” 表示 “德国地区使用的德语” 对应的本地化规则。
- currencyName 货币单位名称 还会有一个货币代码
- areaCode ‘ID#62’ 国家代码+国际电话区号 组成,#无实际意义,仅用于分割
货币单位相关问题
- 公共hooks函数里应该有返回当前的currencyName
- 对所有的货币数字都要使用函数进行格式化处理
- 例如
const number = 123456.789;console.log(new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR" }).format(number,),);
时间相关问题
- 处理时间时,使用第三方库moment/dayjs 都要添加 date.tz(timezone)处理
- 时间组件使用时,要传入timezone或utc偏移时间
- 显示时间时要处理成对应国家的时间
- 时间戳是没有时区的,需要根据用户的时区来展示时间.
- 一般有一个format函数对当前时区时间,通过当前国家currentLocaleConfig.formats配置进行格式化
- 不同时区同一时间获得的本地时间转到 utc0 是不同的
- moment 修改同一个时间对象的时区,会改变时间对象的时间,所以需要 clone 一个新的对象来操作
- 时间改为默认开始和结束时间,需要提前确定是根据用户时区来修改还是统一使用utc 0标准时区
const [newStartTime, newEndTime] = (value as number[]) || [];const startTimeMoment = moment(newStartTime * 1000).startOf('day').unix();const endTimeMoment = moment(newEndTime * 1000).endOf('day').unix();console.log('handleDateChange: ',value,[startTimeMoment, endTimeMoment],moment(newStartTime * 1000).tz(timezone).startOf('day').unix(),moment(newEndTime * 1000).tz(timezone).endOf('day').unix(),);
数字相关问题
- 千分位符号 小数点符号不一样
- 在数字格式化中,两个符号的作用完全不同,需先区分:
- 千分位分隔符:用于分隔整数部分的 “每三位数字”,方便阅读大数值(如 1000 → 1.000);
- 小数点分隔符:用于分隔整数部分和小数部分(如 1000.5 → 1.000,5)。
- 例如 (德国(de-DE)的数字格式:“.” 千分位,“,” 小数点; 印尼(id-ID)的数字格式:同样 “.” 千分位,“,” 小数点)
- 千位分隔符(德国用 . 作为千位分隔符:1.000 表示 1000);
- 小数点符号(德国用 , 作为小数点:100,50 表示 100.5)。
const formatNumberWithSeparator = (number: number | string,formatOptions: any = {},) => {if (number === undefined || number === null) {return number;}const numberFormat = new Intl.NumberFormat(langCode, {...formatOptions,});return numberFormat.format(Number(number));};const formatNumberWithParser = (price: string) => {if (price === undefined || price === null) {return '';}const parsedValue = parseInt(price.toString().replace(/[^\d]/g, ''), 10);return isNaN(parsedValue) ? '' : parsedValue;};