如何从时区偏移
How to get offset from TimeZone
我只想从 TimeZone 获取偏移量 (+02:00),但它似乎不适用于 IST、JST、EST 和 BET。
TimeZone exchangeTimeZone = banker.getTimeZone();
String timeZone = ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID())).getOffset().getId();
返回错误“未知时区 ID:EST”。我无法使用日期对象。
ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID(), ZoneId.SHORT_IDS))
.getOffset().getId();
您可以尝试为您得到的缩写查找映射:
public static ZoneId getFromAbbreviation(String abbreviation) {
return ZoneId.of(ZoneId.SHORT_IDS.get(abbreviation));
}
你可以获得这样的偏移量 main
:
public static void main(String[] args) {
ZoneId istEquivalent = getFromAbbreviation("IST");
ZoneId estEquivalent = getFromAbbreviation("EST");
ZoneId jstEquivalent = getFromAbbreviation("JST");
ZoneId betEquivalent = getFromAbbreviation("BET");
ZonedDateTime istNow = ZonedDateTime.now(istEquivalent);
ZonedDateTime estNow = ZonedDateTime.now(estEquivalent);
ZonedDateTime jstNow = ZonedDateTime.now(jstEquivalent);
ZonedDateTime betNow = ZonedDateTime.now(betEquivalent);
System.out.println("IST --> " + istEquivalent + " with offset " + istNow.getOffset());
System.out.println("EST --> " + estEquivalent + " with offset " + estNow.getOffset());
System.out.println("JST --> " + jstEquivalent + " with offset " + jstNow.getOffset());
System.out.println("BET --> " + betEquivalent + " with offset " + betNow.getOffset());
}
输出是
IST --> Asia/Kolkata with offset +05:30
EST --> -05:00 with offset -05:00
JST --> Asia/Tokyo with offset +09:00
BET --> America/Sao_Paulo with offset -03:00
如您所见,EST
根本没有区域名称,只有一个偏移量。
TimeZone.toZoneId()
// Never do this in your code: Get a TimeZone with ID EST for demonstration only.
TimeZone tz = TimeZone.getTimeZone("EST");
String currentOffsetString = ZonedDateTime.now(tz.toZoneId())
.getOffset()
.getId();
System.out.println(currentOffsetString);
刚才运行时输出:
-05:00
与您在代码中使用的 one-arg ZoneId.of
方法相反,TimeZone.toZoneId()
确实处理已弃用的三字母缩写(这可能被视为优势或劣势,具体取决于你的情况和你的品味)。所以上面的代码也适用于许多这样的三字母缩写,包括 EST。
我只是犹豫地加入了上面的第一行代码。它有几处错误:我们不应该在我们的代码中创建 old-fashioned TimeZone
对象,而是依赖现代 ZonedId
和来自 java.time 的相关 类,现代 Java 日期和时间 API。我们也不应该依赖三个字母的时区缩写。它们已被弃用,未标准化且通常模棱两可。例如,EST 可能表示澳大利亚东部标准时间或北美东部标准时间。为了增加混淆,有些人会希望您在夏季获得东部时间和夏令时 (DST)。使用 TimeZone
你不需要。您得到一个全年使用标准时间的时区。对于 AST、PST 和 CST,不是。
然而,您通常无法控制从 API 中获得的内容。如果你不幸获得了一个 ID 为 EST 的 old-fashioned TimeZone
对象,上面的代码向你展示了进入 java.time.[=18= 领域所需的转换]
我只想从 TimeZone 获取偏移量 (+02:00),但它似乎不适用于 IST、JST、EST 和 BET。
TimeZone exchangeTimeZone = banker.getTimeZone();
String timeZone = ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID())).getOffset().getId();
返回错误“未知时区 ID:EST”。我无法使用日期对象。
ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID(), ZoneId.SHORT_IDS))
.getOffset().getId();
您可以尝试为您得到的缩写查找映射:
public static ZoneId getFromAbbreviation(String abbreviation) {
return ZoneId.of(ZoneId.SHORT_IDS.get(abbreviation));
}
你可以获得这样的偏移量 main
:
public static void main(String[] args) {
ZoneId istEquivalent = getFromAbbreviation("IST");
ZoneId estEquivalent = getFromAbbreviation("EST");
ZoneId jstEquivalent = getFromAbbreviation("JST");
ZoneId betEquivalent = getFromAbbreviation("BET");
ZonedDateTime istNow = ZonedDateTime.now(istEquivalent);
ZonedDateTime estNow = ZonedDateTime.now(estEquivalent);
ZonedDateTime jstNow = ZonedDateTime.now(jstEquivalent);
ZonedDateTime betNow = ZonedDateTime.now(betEquivalent);
System.out.println("IST --> " + istEquivalent + " with offset " + istNow.getOffset());
System.out.println("EST --> " + estEquivalent + " with offset " + estNow.getOffset());
System.out.println("JST --> " + jstEquivalent + " with offset " + jstNow.getOffset());
System.out.println("BET --> " + betEquivalent + " with offset " + betNow.getOffset());
}
输出是
IST --> Asia/Kolkata with offset +05:30
EST --> -05:00 with offset -05:00
JST --> Asia/Tokyo with offset +09:00
BET --> America/Sao_Paulo with offset -03:00
如您所见,EST
根本没有区域名称,只有一个偏移量。
TimeZone.toZoneId()
// Never do this in your code: Get a TimeZone with ID EST for demonstration only.
TimeZone tz = TimeZone.getTimeZone("EST");
String currentOffsetString = ZonedDateTime.now(tz.toZoneId())
.getOffset()
.getId();
System.out.println(currentOffsetString);
刚才运行时输出:
-05:00
与您在代码中使用的 one-arg ZoneId.of
方法相反,TimeZone.toZoneId()
确实处理已弃用的三字母缩写(这可能被视为优势或劣势,具体取决于你的情况和你的品味)。所以上面的代码也适用于许多这样的三字母缩写,包括 EST。
我只是犹豫地加入了上面的第一行代码。它有几处错误:我们不应该在我们的代码中创建 old-fashioned TimeZone
对象,而是依赖现代 ZonedId
和来自 java.time 的相关 类,现代 Java 日期和时间 API。我们也不应该依赖三个字母的时区缩写。它们已被弃用,未标准化且通常模棱两可。例如,EST 可能表示澳大利亚东部标准时间或北美东部标准时间。为了增加混淆,有些人会希望您在夏季获得东部时间和夏令时 (DST)。使用 TimeZone
你不需要。您得到一个全年使用标准时间的时区。对于 AST、PST 和 CST,不是。
然而,您通常无法控制从 API 中获得的内容。如果你不幸获得了一个 ID 为 EST 的 old-fashioned TimeZone
对象,上面的代码向你展示了进入 java.time.[=18= 领域所需的转换]