在spring中为每个请求设置时区



我在UTC时区的DB中有数据,在客户端上有一些特定时区的逻辑。

决定从用户所在时区的服务器返回数据,因此有一个流:

  1. 客户端通过javascript检测用户时区
  2. 发送自定义报头(即"X-TIMEZONE")
  3. 服务器拦截请求(在Filter中)并为它设置当前时区(每个请求)
  4. 服务器处理转换并向其所在时区的用户返回数据

所以问题是设置请求范围的时区,这是可能的吗?

我发现Timezone.setDefault()为一般应用程序设置时区。

谢谢。

希望我正确理解了你的问题。几周前我遇到了一个类似的问题,这就是我的解决方案。我的代码被托管在时间是UTC的地方,所以如果你的代码没有托管在那里,你可以执行Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));使它成为UTC。我传入的变量timezone就是我想要的目标时区。这基本上是添加或减去毫秒,以根据您想要的时区将其转换为时间。时间的日历对象应该是您正在查找的时间。

Calendar time = Calendar.getInstance();
time.setTime(date);
TimeZone localTimeZone = TimeZone.getTimeZone(timezone);
int offSet = localTimeZone.getOffset(date.getTime());
time.set(Calendar.MILLISECOND, time.get(Calendar.MILLISECOND) + offSet);

在这个链接中,您可以找到一个有效的时区选项列表。http://tutorials.jenkov.com/java-date-time/java-util-timezone.html

您可以尝试检测客户端的时区。但最终确定用户想要的时区的唯一可靠方法是问她/他。

TimeZone.setDefault影响在该JVM中运行的所有应用程序的所有线程中的所有代码。除非万不得已,否则不要这样做。相反,传递一个表示所需时区的对象,并在可选的时区参数中使用它。

与早期版本的Java捆绑在一起的麻烦的旧日期时间类已经被Java取代。Java 8及以后版本中内置的time类。许多功能被向后移植到Java 6;7在ThreeTen-Backport,并进一步适应Android在ThreeTenABP。

以UTC获取当前时刻。

Instant instant = Instant.now();

应用时区获取ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

要创建一个表示该值的String,调用toString或使用DateTimeFormatter。搜索堆栈溢出有很多例子

相关内容

  • 没有找到相关文章

最新更新