在joda时间使用parseDateTime时休息一天

时间:2013-06-14 20:51:56

标签: java parsing jodatime

我在joda时使用parseDateTime方法时遇到问题。当我尝试解析下面的日期时,结果是休息一天。我知道已经有类似的线索了,我知道如果你的dayOfWeek和dayOfMonth不匹配,它会优先考虑dayOfWeek。但我的日期是有效的 - 我已经检查了2月22日是星期五。但是当我解析它时,我将在星期四,即2月21日。这是代码:

DateTimeFormatter NBSfmt = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z");
DateTimeFormatter MYfmt = DateTimeFormat.forPattern("yyyy-MM-dd");

String date ="Fri, 22 Feb 2013 00:00:00 +0000";
    DateTime datetime = NBSfmt.parseDateTime(date);
            System.out.println(datetime.toString());

这是输出: 2013-02-21T19:00:00.000-05:00

任何人都知道这里发生了什么?任何见解将不胜感激。 谢谢, 保罗

2 个答案:

答案 0 :(得分:4)

这是由您的时区造成的。您可以在+0000中定义它,然后在-05:00中查看它。这使得它出现在前一天。如果将其标准化为UTC,它应该是相同的。

尝试此代码,作为证据:

package com.sandbox;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Sandbox {

    public static void main(String[] args) {
        DateTimeFormatter NBSfmt = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z");

        String date = "Fri, 22 Feb 2013 00:00:00 -0500";
        DateTime datetime = NBSfmt.parseDateTime(date);
        System.out.println(datetime.toString());
    }

}

对于,这应该显示“正确的一天”。但对我来说,它显示2013-02-21T21:00:00.000-08:00,因为我的时区与你不同。您的原始代码中也会出现同样的情况。

以下是如何以UTC格式打印字符串:

package com.sandbox;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Sandbox {

    public static void main(String[] args) {
        DateTimeFormatter NBSfmt = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z");

        String date = "Fri, 22 Feb 2013 00:00:00 +0000";
        DateTime datetime = NBSfmt.parseDateTime(date);
        System.out.println(datetime.toDateTime(DateTimeZone.UTC).toString());
    }

}

这会打印2013-02-22T00:00:00.000Z

答案 1 :(得分:1)

您的时区为-5,joda在示例中将输入视为UTC。如果需要,您可以使用withZone获取新的格式化程序。