在Java中,TimeZone.getTimeZone()可以替代吗?

时间:2018-06-21 13:53:43

标签: java timezone

在Java中,TimeZone.getTimeZone()可以替代getTimeZone(),因为synchronizedpublic static synchronized TimeZone getTimeZone(String ID) { return getTimeZone(ID, true); } ,导致我的程序/应用程序按比例缩小。

GetElements

2 个答案:

答案 0 :(得分:3)

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

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

Java 1.0和1.1中的日期和时间类-DateCalendarSimpleDateFormat以及TimeZone —早已过时,并且从未经过精心设计。 java.time,现代Java日期和时间API自Java 8(四年前发布)以来已包含在Java中。它取代了它们,并且更好用。

如果您认为自己需要TimeZone,例如用于设置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 [美国/道森克里克]

当然,对于旧版API,您可能需要老式TimeZone对象,而您要么无法更改,要么现在不想更改。在这种情况下,请使用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中),我认为您不需要那么多。我仍然明确推荐使用ZoneId而不是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,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分:0)

TimeZone.getTimeZone(ZoneId)呢?哪个不同步:

// JDK 8 source
public static TimeZone getTimeZone(ZoneId zoneId) {
    String tzid = zoneId.getId(); // throws an NPE if null
    char c = tzid.charAt(0);
    if (c == '+' || c == '-') {
        tzid = "GMT" + tzid;
    } else if (c == 'Z' && tzid.length() == 1) {
        tzid = "UTC";
    }
    return getTimeZone(tzid, true);
}

请参见以下示例:

TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of("Europe"));