Java 11,获取用户本地计算机的时区

eivnm1vs  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(144)

我们正在开发日期以GMT格式存储的应用程序,需要根据用户本地时钟时区显示日期和时间
Java 11,当我更改时区时,它需要JVM重新启动,因此在服务器启动期间使用旧时区。
有没有办法在不重启JVM的情况下确定机器(OS)的时区?
代码

Calendar cal = Calendar.getInstance();
        System.out.println(" -- " + TimeZone.getDefault());
        long milliDiff = cal.get(Calendar.ZONE_OFFSET);
        // Got local offset, now loop through available timezone id(s).
        String[] ids = TimeZone.getAvailableIDs();
        String name = null;
        for (String id : ids) {
            System.out.println("ID  : " + id);
            TimeZone tz = TimeZone.getTimeZone(id);
            System.out.println("TZ : " + tz.getRawOffset());
            if (tz.getRawOffset() == milliDiff) {
                // Found a match.
                name = id;
                break;
            }
        }
        System.out.println("Name " + name);

上面的代码作为独立的工作正常,但当集成到Web应用程序(JVM)它的KO。

qvtsj1bj

qvtsj1bj1#

java.时间

您使用的日期-时间类很糟糕,几年前就被JSR310中定义的现代 * java.time * 类取代了。

避免设置默认时区

无需设置JVM的当前默认时区。这样做是有风险的,因为您会立即影响在该JVM中的所有应用中运行的所有线程中的所有其他代码。而且这样做是不可靠的,因为该JVM中的任何应用的任何线程中的任何代码都可以在您背后随时更改时区。

一个月一个月

使用Instant类捕获UTC中显示的当前时刻(与UTC的偏移量为零小时-分钟-秒)。

Instant now = Instant.now();
System.out.println( "now = " + now );

现在.到字符串()= 2023 - 02 - 16T06:24:54.944850Z

ZoneId

时区由ZoneId类表示。
x一个一个一个一个x一个一个二个x

用户看到的当前时刻

你问:
需要根据用户本地时钟时区显示日期和时间
在运行时捕获JVM的当前默认时区。

ZoneId z = ZoneId.systemDefault() ;

但是,如果关键,您的应用应确认用户的预期时区。
Instant对象调整到那个区域。相同的时刻,不同的挂钟时间。

ZonedDateTime zdt = instant.atZone( z ) ;

或者跳过Instant对象直接获取ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.now( z ) ;

相关问题