在Java中,TimeZone.getTimeZone()
可以替代getTimeZone()
,因为synchronized
是public static synchronized TimeZone getTimeZone(String ID) {
return getTimeZone(ID, true);
}
,导致我的程序/应用程序按比例缩小。
GetElements
答案 0 :(得分:3)
您不想在2018年使用TimeZone
。现代示例:
ZoneId zone = ZoneId.of("America/Dawson_Creek");
Java 1.0和1.1中的日期和时间类-Date
,Calendar
,SimpleDateFormat
以及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.time
在Java 6和7上也能很好地工作。只有到过时的类的转换是不同的,例如:
TimeZone oldfashionedTimeZone = DateTimeUtils.toTimeZone(zone);
org.threeten.bp
导入日期和时间类。java.time
。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 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"));