日期时间和简单日期时间格式结果不同

时间:2016-08-28 23:07:54

标签: java jodatime

我有以下代码片段:

        DateTime dateTime = new DateTime().withZone(DateTimeZone.forID("America/Chicago"))
                .withYear(2016)
                .withMonthOfYear(8)
                .withDayOfMonth(25)
                .withHourOfDay(12)
                .withMinuteOfHour(37);

        System.out.println("DateTime: ");
        System.out.println(dateTime.toDate().getTime());

        String str = "2016-8-25 12:37 AM CST";
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-M-dd hh:mm a z");

        System.out.println("SDF: ");
        try {
            System.out.println(sdf.parse(str).getTime()+"");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

根据我的理解,两者都代表相同的日期(因此时代也应该相同)。但是我得到的结果是:

DateTime: 
1472146669119
SDF: 
1451198220000

如果我将时区更改为CDT,那么我得到:

DateTime: 
1472146668746
SDF: 
1451194620000

所以我希望有一个善良的灵魂会启发我(帮助这个可怜的灵魂)。

由于

更新

我使用以下修改后的代码:

        DateTime dateTime = new DateTime(2016, 8, 25, 12, 37, DateTimeZone.forID("America/Chicago"));

        System.out.println("DateTime: ");
        System.out.println(dateTime.toDate().getTime());

        String str = "2016-8-25 12:37 AM CDT";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a z");

        System.out.println("SDF: ");
        try {
            System.out.println(sdf.parse(str).getTime()+"");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

现在我得到了:

DateTime: 
1472146620000
SDF: 
1472103420000

2 个答案:

答案 0 :(得分:0)

下面:

System.out.println(sdf.parse(str).getTime()+"");

您正在使用格式化的字符串,该字符串不包含秒数,并将其解析为日期。关于它的第二个丢失的信息,所以时间四舍五入到:12:37:00。

答案 1 :(得分:0)

在你发布的第二段代码中,这个日期/时间:

new DateTime(2016, 8, 25, 12, 37, DateTimeZone.forID("America/Chicago"));
//                         ^ - midday

...是2016年8月25日中午后37分钟。

这个日期:

String str = "2016-8-25 12:37 AM CDT";

...是2016年8月25日午夜后的37分钟。

对于匹配的日期,我希望第一个应该是:

new DateTime(2016, 8, 25, 0, 37, DateTimeZone.forID("America/Chicago"));
//                        ^ - midnight