将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.Date
和java.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));