我正在尝试将GMT + 2时间转换为GMT-4时间。但是我得到了意想不到的结果。帮助我了解如何实现将一个时区时间转换为其他时区时间。
originTime = "2015-08-15T10:25:00";
SimpleDateFormat converter = new SimpleDateFormat("yyyy-MM-dd hh:mm");
converter.setTimeZone(TimeZone.getTimeZone("GMT-4"));
GregorianCalendar oc = originTime.toGregorianCalendar();
String OriginStart=converter.format(oc.getTime());
上面的代码必须给originStart时间小于给定时间如果它是GMT-4。 但我的OriginStart时间大于给定时间。
答案 0 :(得分:0)
假设时区字符串有效(因为我已经尝试过)尝试类似
的内容String originTime = "2015-08-15 10:25";
SimpleDateFormat converter = new SimpleDateFormat("yyyy-MM-dd hh:mm");
converter.setTimeZone(TimeZone.getTimeZone("GMT+10"));
Date date = converter.parse (originTime);
converter.setTimeZone(TimeZone.getTimeZone("GMT-4"));
String OriginStart=converter.format(date);
答案 1 :(得分:0)
通常,使用填充零作为偏移小时。但这是不特定代码中的问题。至少不是根据明确接受单个数字的TimeZone
类的文档。
ISO 8601标准要求偏移小时以填充零。因此,请使用-04
而不是-4
。
顺便说一下,java.time的原始版本有一个错误,它无法在没有菜单的情况下解析偏移值的小时。因此,在这种情况下,请使用-04:00
而不是-04
。
时区不仅仅是UTC(GMT)的偏移量。时区包括有关夏令时(DST)和过去,现在和将来的其他异常的规则。如果你有一个specific time zone name,请使用Joda-Time。
+02:00
时区名称的示例为Africa/Bujumbura
。 -04:00
,America/Martinique
。
java.util.Date
java.util.Date / .Calendar和SimpleDateFormat类非常麻烦且令人困惑。也许是最糟糕的捆绑Java库。避免它们。
而是使用java.time package或Java 8中内置的新{{3}}(受Joda-Time启发)。
ISO 8601标准为日期时间值定义了明智的明确字符串格式。您的输入字符串格式符合此明智标准。
默认情况下,Joda-Time和java.time都会解析并生成ISO 8601格式的字符串。所以不需要指定格式化程序。
使用Joda-Time 2.7编写的示例代码。
定义输入,格式为ISO 8601,没有任何与UTC的偏移。
String input = "2015-08-15T10:25:00";
如果输入和输出,请指定时区。
DateTimeZone zoneInput = DateTimeZone.forOffsetHours( 2 );
// DateTimeZone zoneInput = DateTimeZone.forID( "Africa/Bujumbura" ); // Preferably the specific time zone name.
DateTimeZone zoneTarget = DateTimeZone.forOffsetHours( -4 );
// DateTimeZone zoneTarget = DateTimeZone.forID( "America/Martinique" ); // Preferably the specific time zone name.
在分配时区时解析字符串。然后调整时区。
DateTime dateTimeOriginal = new DateTime( input , zoneInput );
DateTime dateTimeTarget = dateTimeOriginal.withZone( zoneTarget );
转储到控制台。
System.out.println( "zoneInput / zoneTarget : " + zoneInput + " / " + zoneTarget );
System.out.println( "dateTimeOriginal : " + dateTimeOriginal );
System.out.println( "dateTimeTarget : " + dateTimeTarget );
跑步时。
zoneInput / zoneTarget : +02:00 / -04:00
dateTimeOriginal : 2015-08-15T10:25:00.000+02:00
dateTimeTarget : 2015-08-15T04:25:00.000-04:00