首页 > 解决方案 > Java 中是否有替代 TimeZone.getTimeZone() 的方法?

问题描述

TimeZone.getTimeZone()在 Java 中是否有任何替代方案,因为getTimeZone()issynchronized导致我的程序/应用程序缩小。

public static synchronized TimeZone getTimeZone(String ID) {
       return getTimeZone(ID, true);
 }

标签: javatimezone

解决方案


您不想TimeZone在 2018 年使用。现代示例:

    ZoneId zone = ZoneId.of("America/Dawson_Creek");

Java 1.0 和 1.1 中的日期和时间类—— Date, Calendar, SimpleDateFormatand also TimeZone——早已过时并且从来没有经过良好的设计。java.time,现代 Java 日期和时间 API 自 Java 8(四年前推出)以来已包含在 Java 中。它取代了它们,并且使用起来更好。

如果你认为你需要 a TimeZone,例如设置 a 的时区Calendar,这个类也已被替换(正如我所说,它们都有)。而是使用现代的ZonedDateTime

    ZonedDateTime dateTime = ZonedDateTime
            .parse("2018-06-22T01:23:31.615464+11:00[Pacific/Guadalcanal]");
    ZonedDateTime converted = dateTime.withZoneSameInstant(zone);
    System.out.println("2018-06-22T01:23:31.615464 in Guadalcanal = " + converted);

输出:

2018-06-22T01:23:31.615464 在瓜达尔卡纳尔岛 = 2018-06-21T07:23:31.615464-07:00[America/Dawson_Creek]

当然,您可能需要一个TimeZone用于旧 API 的老式对象,而您现在不能更改或不想更改。在这种情况下,请使用 Lino 在另一个答案中指出的转换:

    TimeZone oldfashionedTimeZone = TimeZone.getTimeZone(zone);
    System.out.println(oldfashionedTimeZone);

sun.util.calendar.ZoneInfo[id="America/Dawson_Creek",offset=-25200000,dstSavings=0,useDaylight=false,transitions=58,lastRule=null]

如果您的问题是同步TimeZone.getTimeZone(String)减慢了您的程序,我想知道TimeZone您正在创建多少对象?只有 600 个可用的时区 ID(在我的 Java 10 中),我认为您不需要那么多。我仍然明确推荐ZoneIdover TimeZone,但如果创建时间过长,缓存它们可能是更好的选择?

问题:但是如果我使用 Java 6 或 7 怎么办?

没什么大问题。java.time在 Java 6 和 7 上也能很好地工作。只有对过时类的转换不同,例如:

    TimeZone oldfashionedTimeZone = DateTimeUtils.toTimeZone(zone);
  • 在 Java 8 及更高版本以及较新的 Android 设备(据我所知,从 API 级别 26 开始)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接


推荐阅读