如何在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
相关产品推荐
相关产品推荐

