在春天为每个请求设置时区

时间:2016-07-05 12:42:34

标签: java spring date datetime

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

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

  1. 客户端通过javascript检测用户的时区
  2. 将其发送到自定义标头(即"X-TIMEZONE"
  3. 服务器拦截请求(在Filter中)并为其设置当前时区(按请求)
  4. 服务器处理转换并将数据返回给他的时区中的用户
  5. 所以问题是设置请求范围的时区,它甚至可能吗?

    我发现Timezone.setDefault()通常会为应用程序设置时区。

    感谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

TimeZone.setDefault会影响该JVM中运行的所有所有应用程序的所有线程中的所有代码。这样做只是作为最后的手段。而是传递一个表示所需时区的对象,并在可选的时区参数中使用它。

与最早版本的Java捆绑在一起的麻烦的旧日期时间类已被Java 8及更高版本中内置的java.time类所取代。许多功能都被反向移植到Java 6& 7在ThreeTen-Backport中,并在ThreeTenABP中进一步适应Android。

以UTC格式获取当前时刻。

Instant instant = Instant.now();

应用时区以获得ZonedDateTime

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

要创建表示该值的字符串,请致电toString或使用DateTimeFormatter。 Search Stack Overflow有很多例子。