将IST转换为GMT的日期格式



IST转换为GMT时的问题。

DateFormat df = new SimpleDateFormat("HH:mm:ss z");
String input = "05:30:00 IST";
Date d = df.parse(input);
Calendar c = Calendar.getInstance();
c.setTime(d);

System.out.println(c.getTime());

Thu Jan 01 03:30:00 GMT 1970作为输出而不是Thu Jan 01 00:00:00 GMT 1970

您应该小心使用三个字母的时区缩写,因为它们不明确。在这种情况下,IST可以指:

  • 印度标准时间(UTC+0530)
  • 以色列标准时间(UTC+02)
  • 爱尔兰标准时间(UTC+01)

维基百科列出了一些常见的时区缩写;其他不明确的常见缩写有:

  • 上午
  • AST
  • BST
  • CDT
  • CST
  • ECT
  • FKST
  • GST
  • MST

最好使用UTC偏移量(例如印度标准时间的+0530)或唯一定义的时区标识符(例如Asia/Calcutta

您在这里试图做的事情有很多错误。

  • 您正试图使用java.util.Date对象来只包含一天中的时间(小时、分钟、秒)。java.util.Date对象不适用于此目的。java.util.Date对象实际上是一个时间戳——它代表一个"绝对"时刻,自1970年1月1日00:00:00 GMT以来以毫秒为单位计算。

  • java.util.Date对象不包含时区信息。无法将Date对象从一个时区转换到另一个时区,因为Date对象根本不包含有关时区的信息。

  • 如果你只知道小时、分钟和秒,就无法将一天中的时间从一个时区转换到另一个时区。结果还取决于日期(年、月、日)-结果可能会受到夏令时转换的影响。因此,如果你不知道日期,就不可能将一天中的时间从一个时区转换到另一个时区。

如果您使用Java 8 java.time API,那么这很容易;使用ZonedDateTime,其中确实包含关于时区的信息。

// Assuming that with "IST" you mean India Standard Time
ZonedDateTime input = ZonedDateTime.of(2015, 3, 23, 5, 30, 0, 0, ZoneId.of("Asia/Calcutta"));
System.out.println(input);
ZonedDateTime output = input.withZoneSameInstant(ZoneId.of("GMT"));
System.out.println(output);

如果要使用旧的java.util.Datejava.util.Calendar API,则在用于显示日期的DateFormat对象上设置时区,而不是在Date对象本身上设置时区:

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
cal.set(2015, Calendar.MARCH, 23, 5, 30, 0);
Date input = cal.getTime();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
df.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
System.out.println(df.format(input));
df.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(df.format(input));

最新更新