簡體   English   中英

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

[英]Is there any alternative to TimeZone.getTimeZone() in Java?

Java中的TimeZone.getTimeZone()是否有替代方法,因為getTimeZone()synchronized ,導致我的程序/應用程序按比例縮小。

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

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

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

-從Java 1.0和1.1的日期和時間班DateCalendarSimpleDateFormatTimeZone -是早已過時的,而且從來沒有精心設計的。 自Java 8(四年前開始)以來,Java便已包含現代Java日期和時間API java.time 它取代了它們,並且更好用。

如果您認為需要一個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 = “美國/道森克里克”,偏移= -25200000,dstSavings = 0,useDaylight =假,過渡= 58,lastRule =空]

如果您的問題是TimeZone.getTimeZone(String)的同步正在減慢您的程序速度,我想知道您正在創建多少個TimeZone對象? 僅有600個可用的時區ID(在我的Java 10中),我認為您不需要那么多。 我仍然明確建議在TimeZone推薦ZoneId ,但是如果創建時間太長,將它們緩存可能是更好的選擇?

問題:但是,如果我使用的是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導入日期和時間類。

鏈接

那么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"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM