您的偏移量无效
有效的偏移量必须包含填充零。您的偏移字符串GMT+5:30 应该是GMT+05:30,0 在5 之前。
除此之外,Meno Hochschild 的the Answer 是正确和明智的。
java.time
java.util.Date/.Calendar 和 SimpleDateFormat 类是出了名的麻烦、混乱和缺陷。 避开它们。
改为使用 Java 8 及更高版本中的 java.time 包。如果缺少,请使用Joda-Time 库。
这是一些 java.time 代码(Java 8)。
首先,将您的输入解析为“本地”日期时间值,这意味着没有附加任何时区。由于输入中没有包含偏移量或时区,因此该值可以应用于任何特定的地区。
String input = "11-05-15 11:54:55"; // Strongly recommend using 4-digit year whenever possible, as suggested in Meno Hochschild’s Answer.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd-MM-yy HH:mm:ss" ); // No need for Locale in this case, but always consider it.
LocalDateTime localDateTime = LocalDateTime.parse( input , formatter );
接下来,我们假设这个值是为了代表印度的一个时刻。让我们分配一个时区。我们可以只分配一个偏移量。但通常我们应该使用时区。时区是加上过去、现在和未来的一组调整和异常规则的偏移量,例如夏令时。
首先我们为印度实例化一个时区。然后我们在添加时区的同时根据LocalDateTime生成ZonedDateTime。
// Assign a time zone.
//ZoneId zoneId_plus_5_30 = ZoneId.of( "GMT+05:30" ); // You can use an offset, but know that a time zone is *more* than an offset.
ZoneId zoneIdKolkata = ZoneId.of( "Asia/Kolkata" ); // Better to use a time zone name if one is applicable. Ex: "Asia/Kolkata".
ZonedDateTime zonedDateTimeKolkata = ZonedDateTime.of( localDateTime , zoneIdKolkata );
为了好玩,让我们将同一时刻调整为 UTC 和蒙特利尔。
ZonedDateTime zonedDateTimeUtc = zonedDateTimeKolkata.withZoneSameInstant( ZoneOffset.UTC );
ZonedDateTime zonedDateTimeMontréal = zonedDateTimeKolkata.withZoneSameInstant( ZoneId.of( "America/Montreal" ) );
转储到控制台。
System.out.println( "Input: " + input );
System.out.println( "localDateTime: " + localDateTime );
System.out.println( "zonedDateTimeKolkata: " + zonedDateTimeKolkata );
System.out.println( "zonedDateTimeUtc: " + zonedDateTimeUtc );
System.out.println( "zonedDateTimeMontréal: " + zonedDateTimeMontréal );
运行时。
Input: 11-05-15 11:54:55
localDateTime: 2015-05-11T11:54:55
zonedDateTimeKolkata: 2015-05-11T11:54:55+05:30[Asia/Kolkata]
zonedDateTimeUtc: 2015-05-11T06:24:55Z
zonedDateTimeMontréal: 2015-05-11T02:24:55-04:00[America/Montreal]