如何将一个时区中的日期和时间转换为java中的其他时区

时间:2015-04-09 12:24:46

标签: java date time

我正在尝试将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时间大于给定时间。

2 个答案:

答案 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:00America/Martinique

的示例

避免java.util.Date

java.util.Date / .Calendar和SimpleDateFormat类非常麻烦且令人困惑。也许是最糟糕的捆绑Java库。避免它们。

而是使用java.time package或Java 8中内置的新{{3}}(受Joda-Time启发)。

ISO 8601

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