Salesforce开启ICU后DateTime.parse()失效,求日期时间与字符串互转方案
Salesforce DateTime与String类型互转兼容方案
DateTime.parse()方法本身依赖当前用户的区域设置、时区以及组织ICU功能配置,格式匹配规则会随配置发生变化,因此不适合用于固定格式字符串的解析,你遇到的报错正是ICU启用前后系统默认日期格式规则变更导致的。
以下是不受ICU配置影响的稳定互转方案:
String 转 DateTime
- 场景1:输入为标准ISO格式字符串(如
2020-11-23 11:23:00)
直接使用Datetime.valueOf()或Datetime.valueOfGmt()方法,无需依赖区域配置:// 按当前用户时区解析ISO格式字符串 Datetime dtUserTz = Datetime.valueOf('2020-11-23 11:23:00'); // 按GMT时区解析ISO格式字符串 Datetime dtGmt = Datetime.valueOfGmt('2020-11-23 11:23:00'); - 场景2:输入为自定义格式字符串
使用Apex原生DateTimeFormatter类显式指定解析格式与所属区域,完全规避ICU开关的影响,可兼容你测试的两种格式:// 解析带逗号的日期时间格式 DateTimeFormatter formatterWithComma = DateTimeFormatter.ofPattern('MM/dd/yyyy, hh:mm a', Locale.US); Datetime dt1 = formatterWithComma.parse('11/23/2020, 11:23 AM'); // 解析不带逗号的日期时间格式 DateTimeFormatter formatterWithoutComma = DateTimeFormatter.ofPattern('MM/dd/yyyy hh:mm a', Locale.US); Datetime dt2 = formatterWithoutComma.parse('11/23/2020 11:23 AM');
DateTime 转 String
- 场景1:输出为标准ISO格式
直接调用内置方法即可,输出格式统一固定:Datetime currentDt = Datetime.now(); // 输出带时区标识的ISO标准字符串 String isoStr = currentDt.formatISO(); - 场景2:输出为自定义格式
同样使用DateTimeFormatter类指定输出格式与区域:Datetime currentDt = Datetime.now(); // 输出中文格式的日期时间字符串 DateTimeFormatter cnFormatter = DateTimeFormatter.ofPattern('yyyy年MM月dd日 HH:mm', Locale.CHINA); String cnDtStr = cnFormatter.format(currentDt);
注意:所有自定义格式的转换操作都建议显式指定
Locale与时区,避免不同用户的区域设置差异导致转换结果异常。
内容的提问来源于stack exchange,提问作者Prerna Tamrakar
相关产品推荐
相关产品推荐

