You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:57:02