我在UTC
时区的DB中有数据,在客户端上有一些特定时区的逻辑。
决定从用户所在时区的服务器返回数据,因此有一个流:
- 客户端通过javascript检测用户时区
- 发送自定义报头(即
"X-TIMEZONE"
) - 服务器拦截请求(在
Filter
中)并为它设置当前时区(每个请求) - 服务器处理转换并向其所在时区的用户返回数据
所以问题是设置请求范围的时区,这是可能的吗?
我发现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
。搜索堆栈溢出有很多例子