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

如何在Freemarker中将GregorianCalendar日期转自定义格式并转换时区

在FreeMarker中转换日期时区并格式化的解决方案

嘿,我来帮你搞定这个日期处理的需求!要把你的2018-04-30T00:00:00.000+05:30格式日期转成01/07/2018 9:55 AM ET这种样式,其实分两步就搞定:先把时区切到美国东部时间(ET),再按要求的格式输出。下面是具体操作:

核心实现代码

假设你的日期变量名叫originalDate(就是那个GregorianCalendar对象),直接用FreeMarker的内置函数就能搞定:

${originalDate?datetime?time_zone("America/New_York")?string("dd/MM/yyyy h:mm a 'ET'")}

逐行解释下这段代码:

  • ?datetime:先明确把这个Calendar对象标记为日期时间类型(虽然FreeMarker通常能自动识别,但加上更稳妥,避免意外)
  • ?time_zone("America/New_York"):这一步是关键,把原始的印度时区(+05:30)日期转换成美国东部时区。用这个时区ID的好处是它会自动处理夏令时,不管是EST还是EDT,都能正确转换时间。
  • ?string("dd/MM/yyyy h:mm a 'ET'"):最后按你要的格式输出:
    • dd/MM/yyyy:对应日/月/年的格式(比如01/07/2018)
    • h:mm:12小时制的小时和分钟(不带前导零,比如9:55)
    • a:自动显示AM/PM标记
    • 'ET':用单引号包裹是告诉FreeMarker这是纯文本,直接显示ET,不会被当成格式符号解析

备用时区ID方案

要是America/New_York在你的环境里不好使,试试EST5EDT这个时区ID,同样能正确处理东部时间的夏令时转换:

${originalDate?time_zone("EST5EDT")?string("dd/MM/yyyy h:mm a 'ET'")}

举个实际例子

比如你的原始日期是2018-04-30T00:00:00.000+05:30(印度时间凌晨零点),用上面的代码转换后会输出:

29/04/2018 11:30 PM ET

(毕竟印度时间比东部时间早9.5小时,零点的印度时间对应前一天晚上的11点半)

小提醒

  • 确保你的FreeMarker版本是2.3.20及以上,更早的版本可能不支持?time_zone这个内置函数
  • 如果你的原始日期没带时区信息(比如只是个纯Date对象),那得先指定它的原始时区,再转东部时区,比如:
    ${originalDate?datetime?time_zone("Asia/Kolkata")?time_zone("America/New_York")?string("dd/MM/yyyy h:mm a 'ET'")}
    
    这里先把无时区的日期标记为印度时区,再转成东部时间,结果才准确。

内容的提问来源于stack exchange,提问作者Haziq Showkat Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:46:04