java - Java 中是否有替代 TimeZone.getTimeZone() 的方法?
问题描述
TimeZone.getTimeZone()
在 Java 中是否有任何替代方案,因为getTimeZone()
issynchronized
导致我的程序/应用程序缩小。
public static synchronized TimeZone getTimeZone(String ID) {
return getTimeZone(ID, true);
}
解决方案
您不想TimeZone
在 2018 年使用。现代示例:
ZoneId zone = ZoneId.of("America/Dawson_Creek");
Java 1.0 和 1.1 中的日期和时间类—— Date
, Calendar
, SimpleDateFormat
and 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 中),我认为您不需要那么多。我仍然明确推荐ZoneId
over 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
子包中导入日期和时间类。
链接
- Oracle 教程:日期时间解释如何使用
java.time
. - Java 规范请求 (JSR) 310,
java.time
第一次描述的地方。 - ThreeTen Backport 项目,
java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。 - ThreeTenABP , ThreeTen Backport 的 Android 版
- 问题:如何在Android项目中使用ThreeTenABP,有非常详尽的解释。
推荐阅读
- javascript - 如何在javascript中将二维数组转换为二维字符串
- ios - 单击单元格中的按钮时访问所有单元格
- laravel-5 - 如何从 Laravel 视图中的链接调用控制器方法?
- javascript - Chrome 扩展通知:页面加载时的 API 调用
- jms - 带有 TLS 的 Websphere MQ 的 Nifi JMS 输入
- sql - 为每个参数选择第一个结果
- python - Python只打印一个文件
- javascript - parseFloat 与数字后的字符
- html - 我的图像损坏,没有出现在 HTML 代码中
- javascript - “无法访问未初始化的变量。” 在类构造函数中