为什么Joda DateTime给出的结果与Java Date不同?

时间:2014-01-24 04:28:46

标签: java date datetime jodatime

我使用UTC时区测试Joda DateTime与java.util.Date,我遇到了一个有趣的案例:

import org.joda.time.DateTime;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws ParseException {
        String dt = "2011-06-11T12:00:00Z";
        String format = "yyyy-MM-dd'T'hh:mm:ss'Z'";

        DateFormat df = new SimpleDateFormat(format);
        df.setTimeZone(TimeZone.getTimeZone("UTC"));

        Date d = df.parse(dt);
        DateTime joda = new DateTime(dt);

        // Output Sat Jun 11 05:00:00 PDT 2011
        System.out.println(joda.toDate());

        // Output Fri Jun 10 17:00:00 PDT 2011
        System.out.println(d);
    }
}

我想知道这是一个错误,还是我错过了一些重要的事情?

1 个答案:

答案 0 :(得分:6)

(编辑:更清晰,更正确的答案)

我认为这是因为JODA和Java Date Format在12小时的演示中以不同的方式处理“12”。其中一个人把它当作午夜,而另一个人把它视为中午。

<击>

将您的输入更改为2011-06-11T01:00:00Z将证明我的假设。

这是因为,您正在使用DateTime的构造函数创建JODA时间,后者依次使用ISO格式解析您的String,使用24小时格式:Default format used by JODA,而您使用的DateFormat构建您的Java Date对小时字段使用hh,这意味着12小时格式。因此他们对“12”的解释不同:12小时格式将其视为午夜,而24小时将其视为中午。

最简单的更改是将格式更改为使用24小时演示文稿的yyyy-MM-dd'T'HH:mm:ss'Z',然后这两种格式都正常。