gpt4 book ai didi

java - 使用 Spring MVC + Freemarker 处理用户特定日期/时区转换的最佳方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:20:29 27 4
gpt4 key购买 nike

我想显示存储日期(时区为 UTC),格式为用户时区(每个用户可能不同,并存储在配置文件中)。

我想出的解决方案如下,我想知道这是否是最好的方法,或者是否有其他更简单的解决方案。

时区设置为 UTC:

-Duser.timezone=UTC

Controller 、Freemarker-Template、HandlerInterceptor:

Controller :

@Controller
@RequestMapping("/test")
public class TestController {

@RequestMapping
public String dateTest(Model model){
final Date date = new Date();
model.addAttribute("formattedDate", new SimpleDateFormat("hh:mm:ss").format(date));
model.addAttribute("date", date);
return "test";
}
}

Freemarker-模板:

<#setting time_zone="${currentTimeZone}">

UTC Time: ${formattedDate}<br/>
Localized time for timezone <i>${currentTimeZone}</i>: ${date?time}

处理程序拦截器:

public class TimezoneHandlerInterceptor extends HandlerInterceptorAdapter{

@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {

//Only for testing, in production something like:
//final String currentUserTimezone = userService.getCurrentUser().getTimezoneId();
final String currentUserTimezone = "Europe/Berlin";

modelAndView.addObject("currentTimeZone", currentUserTimezone);
}
}

输出:

UTC Time: 08:03:53
Localized time for timezone Europe/Berlin: 09:03:53

那么是否有更标准甚至开箱即用的方式来实现相同的结果?感谢您的帮助。

最佳答案

由于您两次打印相同的日期,只是渲染不同(不同的时区),这可能只是一个演示(MVC View )问题,因此不应在模型中解决。相反,你可以做这样的事情是模板:

<#import "/lib/utils.ftl" as u>
...
UTC Time: ${u.utcTime(date)}<br/>
Localized time for timezone <i>${currentTimeZone}</i>: ${date?time}

utcTime应该在 utils.ftl 中定义喜欢<#assign u = "com.something.freemarker.UtcTimeMethod"?new()> , 其中com.something.freemarker.UtcTimeMethodTemplateMethodModelEx执行。还有其他方法可以做到这一点,比如 u可能是在 FreeMarker 配置等中定义的共享变量。关键是,您需要打印 UTC 时间不会影响模型。

截至<#setting time_zone=currentTimeZone>部分(请注意那里不需要 ${...}),当然它取决于 Web 应用程序框架,但是如果您在调用模板之前设置时区(例如基于访问者的区域设置),那么好的解决方案是。 FreeMarker 通过 Template.createProcessingEnvironment 支持这一点(参见 JavaDoc),但 Spring MVC 可能没有。

还有一个 Date对象始终以 UTC 格式存储日期时间。您不需要为 -D 设置时区.

关于java - 使用 Spring MVC + Freemarker 处理用户特定日期/时区转换的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22035553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com