关于java:使用joda时间将一个时区转换为另一个时区

converting one time zone to another using joda time

我使用joda time创建了一个函数,可以将一个时区转换为另一个时区,但该函数不接受日期。我已经将以下参数传递给这个函数"Asia/Kolkata""UTC""12-Dec-2014 12:30"。它将引发以下异常:

1
2
3
4
5
6
7
Exception in thread"main" java.lang.IllegalArgumentException: Invalid format:"12-Dec-2014 12:32" is malformed at"-Dec-2014 12:32"
at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:752)
at org.joda.time.convert.StringConverter.getInstantMillis(StringConverter.java:65)
at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:150)
at org.joda.time.DateTime.<init>(DateTime.java:265)
at Dtime.convertTimeZones(Dtime.java:17)
at Dtime.main(Dtime.java:9)

代码如下:

1
2
3
4
5
6
7
8
9
10
public static String convertTimeZones( String fromTimeZoneString,
    String toTimeZoneString, String fromDateTime) {
         DateTimeZone fromTimeZone = DateTimeZone.forID(fromTimeZoneString);
         DateTimeZone toTimeZone = DateTimeZone.forID(toTimeZoneString);
         DateTime dateTime = new DateTime(fromDateTime, fromTimeZone);

         DateTimeFormatter outputFormatter =
             DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm").withZone(toTimeZone);
         return outputFormatter.print(dateTime);
}

DST(日光节约)我将在此日期将参数传递为("美国/丹佛","格林威治标准时间","2014年3月9日02:00"),DST将开始。对于丹佛2014年3月9日星期日,02:00:00时钟向前拨1小时至2014年3月9日星期日,当地夏令时03:00:00但它抛出了例外例外

1
2
3
4
5
Exception in thread"main" java.lang.IllegalArgumentException: Cannot parse"09-Mar-2014 02:00": Illegal instant due to time zone offset transition (America/Denver)
    at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:390)
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:849)
    at timeZone.convertTimeZones(timeZone.java:23)
    at timeZone.main(timeZone.java:14)


你需要用一个inputFormatter来解析你的日期(就像你已经定义的outputFormatter)。像这样的东西

1
2
3
DateTimeFormatter inputFormatter = DateTimeFormat.forPattern(
   "dd-MMM-yyyy HH:mm").withZone(fromTimeZone);
DateTime dateTime = inputFormatter.parseDateTime(fromDateTime);

我测试过,它输出

1
12-Dec-2014 07:00