使用时区获取用户时间,而不是Java中的服务器默认时间和时区



我试图用Java中的本地时区捕获最终用户的时间(例如:太平洋标准时间上午10:00(,但我的代码默认为UTC时间和时区,这是我的代码运行的服务器时间。非常感谢您的帮助。非常感谢。

import java.time.*;
ZoneId z = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.now(z);
String issueTime = zdt.format(DateTimeFormatter.ofPattern("hh:mma z"));

tl;dr

您似乎想要为一天中的时间生成一个具有区域偏移指示器的特定格式的字符串。

ZonedDateTime
.now( 
ZoneId.systemDefault() 
)
.format( 
DateTimeFormatter.ofPattern("hh:mma z") 
)

相同代码:

ZonedDateTime.now( ZoneId.systemDefault() ).format( DateTimeFormatter.ofPattern("hh:mma z") )

您可以省略明确的ZoneId部分,不过我建议保留它以明确您的意图。

ZonedDateTime.now().format( DateTimeFormatter.ofPattern("hh:mma z") )

你说:

我的代码默认为UTC时间和时区

这意味着JVM的当前默认时区被设置为UTC。

验证您的实际时区

您的代码有效。

我怀疑JVM当前的默认时区是UTC。服务器通常应设置为UTC作为其默认时区。

添加对z.toString()的调用,以验证正在播放的默认区域。

ZoneId z = ZoneId.systemDefault();
System.out.println( z.toString() ) ;  // 👈

这是您的代码的一个稍微修改过的版本。请参阅IdeOne.com上实时运行的代码。请注意我们如何为ZonedDateTime指定时区。

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;  // ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
DateTimeFormatter f = DateTimeFormatter.ofPattern("hh:mma z") ; 
String issueTime = zdt.format( f );
System.out.println( issueTime ) ;

10:25太平洋标准时间

顺便说一句,我建议自动本地化,而不是硬编码特定的格式。参见DateTimeFormatter.ofLocalized…方法。

最新更新