Java 使用joda time将一个时区转换为另一个时区

Java 使用joda time将一个时区转换为另一个时区,java,datetime,jodatime,Java,Datetime,Jodatime,我使用joda time制作了一个从一个时区转换到另一个时区的函数,但该函数不接受日期 我已将以下参数传递给此函数“亚洲/加尔各答”,“UTC”,“2014年12月12日12:30”。它正在引发以下异常: Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "12-Dec-2014 12:32" is malformed at "-Dec-2014 12:32" at org.joda.ti

我使用joda time制作了一个从一个时区转换到另一个时区的函数,但该函数不接受日期
我已将以下参数传递给此函数
“亚洲/加尔各答”
“UTC”
“2014年12月12日12:30”
。它正在引发以下异常:

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) 
DST(日光节约)
我正在传递参数(“America/Denver”、“GMT”、“09-Mar-2014 02:00”)在这一天,DST将开始
丹佛
2014年3月9日星期日02:00:00时钟向前拨1小时至
2014年3月9日星期日,当地夏令时03:00:00 但它正在抛出异常
例外情况

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
)。像这样的

DateTimeFormatter inputFormatter = DateTimeFormat.forPattern(
    "dd-MMM-yyyy HH:mm").withZone(fromTimeZone);
DateTime dateTime = inputFormatter.parseDateTime(fromDateTime);
我对它进行了测试,并将其输出

12-Dec-2014 07:00

你能从异常中发布stacktrace的一部分吗?@mdewitt请检查我是否已编辑它FromDateTime需要采用YY-MM-dd HH:MM:ss格式。因此,您希望将其更改为2014-12-12 12:30:00。我将把fromDateTime作为(例如,2014年12月12日)传递给函数。它只需要采用这种格式(yyyy-MM-dd HH:MM)??我应该将这些行粘贴到哪里?我想知道这是否会处理DST自动???@user2841408关于您的问题
将处理DST自动
:(a)阅读文档,然后测试它。(b) 对。这就是调用withZone,根据该时区的规则调整时间的目的。@BasilBourque我已经测试了“America/Denver”,将日期传递为“09-Mar-2014 02:00”,此时DST将开始,但是它抛出了一个异常,我已经在我的问题中包含了这个异常,请参考它并帮助我。你的信息很清楚。那不是一个有效的时间。为什么?因为在它变成2的瞬间,它是3。这就是为什么他们说“向前冲,向后退”。
12-Dec-2014 07:00