首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中有没有TimeZone.getTimeZone()的替代品?

在Java中有没有TimeZone.getTimeZone()的替代品?
EN

Stack Overflow用户
提问于 2018-06-21 21:53:43
回答 2查看 720关注 0票数 2

因为getTimeZone()synchronized,所以在Java语言中有没有TimeZone.getTimeZone()的替代品,这会导致我的程序/应用程序缩容。

代码语言:javascript
运行
复制
public static synchronized TimeZone getTimeZone(String ID) {
       return getTimeZone(ID, true);
 }
EN

回答 2

Stack Overflow用户

发布于 2018-06-21 22:30:53

你不会想在2018年使用TimeZone的。现代的例子:

代码语言:javascript
运行
复制
    ZoneId zone = ZoneId.of("America/Dawson_Creek");

Java1.0和1.1中的date和time类-- DateCalendarSimpleDateFormatTimeZone --很久以前就过时了,而且从来没有设计好过。java.time是现代的Java date and time API,从Java8(四年前发布)起就包含在Java中。它取代了它们,使用起来要好得多。

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

代码语言:javascript
运行
复制
    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);

输出:

Guadalcanal = 2018-06-21T07:23:31.615464-07:00America/Dawson_Creek中的

2018-06-22T01:23:31.615464

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

代码语言:javascript
运行
复制
    TimeZone oldfashionedTimeZone = TimeZone.getTimeZone(zone);
    System.out.println(oldfashionedTimeZone);

偏移量sun.util.calendar.ZoneInfoid="America/Dawson_Creek",=-25200000,dstSavings=0,useDaylight=false,transitions=58,lastRule=null

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

问:但是如果我使用的是Java6或7呢?

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

代码语言:javascript
运行
复制
    TimeZone oldfashionedTimeZone = DateTimeUtils.toTimeZone(zone);

Java8及更高版本以及更新的安卓设备(我听说是从API26开始)的

  • 内置了现代的API。Java6和7中的
  • 获得了ThreeTen后端口,这是新类的后端口(JSR310的ThreeTen;请参阅底部的链接)。(较早的)安卓系统上的
  • 使用的是ThreeTen后端口的安卓版本。它被称为ThreeTenABP。并确保使用subpackages.

org.threeten.bp导入date和time类

链接

票数 3
EN

Stack Overflow用户

发布于 2018-06-21 22:05:53

TimeZone.getTimeZone(ZoneId)呢?不是同步的:

代码语言:javascript
运行
复制
// 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);
}

请参见以下示例:

代码语言:javascript
运行
复制
TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of("Europe"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50970311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档