【问题标题】:how to get current time from given timezone name in java?如何从java中的给定时区名称获取当前时间?
【发布时间】:2017-03-22 06:15:30
【问题描述】:

我想从给定的时区获取当前时间,例如“IST”或“印度标准时间”等。 当输入为“印度标准时间”或“协调世界时间”时,我无法获得时间。它仅适用于“IST”或“UTC”或“EST”等。 我试过 Joda-Time 和 SimpleDateFormat。

SimpleDateFormat sd = new SimpleDateFormat(
            "yyyy.MM.dd G 'at' HH:mm:ss z");
Date date = new Date();
sd.setTimeZone(TimeZone.getTimeZone("IST"));
System.out.println(sd.format(date));



DateTime now = new DateTime();
//DateTimeZone LDateTimeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTimeZone LDateTimeZone = DateTimeZone.forID( "IST" );   //deprecated
System.out.println( "Joda-Time zone: " + now.toDateTime( LDateTimeZone ) );

有没有办法同时处理这两个输入?

【问题讨论】:

  • 始终使用完整的 IANA tz 数据库名称 - Asia/Kolkata。缩写不是唯一的(印度/以色列/爱尔兰?),人性化的名称是特定于语言/地区的。

标签: java datetime timezone jodatime simpledateformat


【解决方案1】:

我不能更强烈地反对使用旧版java.util.Date。您应该改用适当的 java.time 类。

java.time.ZonedDateTime 中,您可以创建一个时区别名地图并随意填充它。它不漂亮,但它有效。

Map<String, String> aliasMap = new HashMap<>();
aliasMap.put("IST", "Asia/Calcutta");
aliasMap.put("Indian Standard Time", "Asia/Calcutta");
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Indian Standard Time", aliasMap));

【讨论】:

  • 毫无疑问,这是处理这种情况的好方法,但在我的情况下,我需要所有时区。我很难对所有可用的时区进行硬编码。
  • Here 是 Java 原生支持的所有 ZoneIds 的列表。这应该可以帮助您创建所需的别名映射。
  • 更好的参考是here。 Java 中有一些不在该列表中,但应视为已弃用。
【解决方案2】:

我认为你可以使用 joda 来做到这一点

TimeZone timezone;
timezone = TimeZone.getTimeZone("Indian Standard Time");
DateTime dt = new DateTime(new Date());
DateTimeZone dtZone = DateTimeZone.forTimeZone(timezone);
DateTime afterSetTimezone = dt.withZone(dtZone);
Date date = afterSetTimezone.toLocalDateTime().toDate();
System.out.println(date);

【讨论】:

  • Sorry TimeZone.getTimeZone("") 函数仅支持像 IST 或 UTC 这样的短名称,因为我在我的问题中附上了代码。它不适用于 TimeZone.getTimeZone("Indian Standard Time")。
猜你喜欢
  • 2013-04-18
  • 2015-03-28
  • 2012-03-23
  • 2018-06-19
  • 2012-02-29
  • 1970-01-01
  • 2017-04-30
  • 2019-06-14
  • 2010-11-21
相关资源
最近更新 更多