Java Joda DateTime getDayOfYear()方法在2013-12-31T23:59:52.000Z时返回366,此时它应该是365

Java Joda DateTime getDayOfYear()方法在2013-12-31T23:59:52.000Z时返回366,此时它应该是365,java,datetime,Java,Datetime,我的程序正在停止并打印出此错误: org.joda.time.IllegalFieldValueException: Value 366 for dayOfYear must be in the range [1,365] at org.joda.time.field.FieldUtils.verifyValueBounds(FieldUtils.java:217) at org.joda.time.field.PreciseDurationDateTimeField.set(PreciseDu

我的程序正在停止并打印出此错误:

org.joda.time.IllegalFieldValueException: Value 366 for dayOfYear must be in the range [1,365]
at org.joda.time.field.FieldUtils.verifyValueBounds(FieldUtils.java:217)
at org.joda.time.field.PreciseDurationDateTimeField.set(PreciseDurationDateTimeField.java:78)
at org.joda.time.chrono.ZonedChronology$ZonedDateTimeField.set(ZonedChronology.java:466)
at org.joda.time.DateTime.withDayOfYear(DateTime.java:1716)
日期是

2013-12-31T23:59:52.000Z
一年中的某一天应该是365。为什么Joda返回366然后抛出一个错误

编辑

错误的其余部分仅包含有关我的类的信息:

at MainProgram.processMinuteLevelAGCRecords(MainProgram.java:405)
at MainProgram.createMinuteLevelAGCFile(MainProgram.java:274)
at MainProgram.main(MainProgram.java:106)
试图获取年份日期的代码如下所示,因为我需要格式为“yyDDD”的julian date:

失败时的“日期”为:

2013-12-31T23:59:52.000Z
第405行是

DateTime dt = new DateTime(0).withYear(year).withDayOfYear(day).withHourOfDay(0).withMinuteOfHour(‌​0).withZoneRetainFields(DateTimeZone.forTimeZone(TimeZone.getTimeZone("UTC")));
编辑2

我有一个DateTime对象,它是从数据库中检索到的时间戳派生的。我的DateTime对象称为“日期”。当我打印“日期”时,我得到

现在,使用上面的DateTime对象“date”的更多代码:

int julianDay = Integer.parseInt(String.format("%04d", date.getYear()).substring(2)
            + String.format("%03d", date.getDayOfYear()));
int year = julianDay/1000;
year = Integer.parseInt(startDate.substring(0,2) + Integer.toString(year));
int day = Integer.parseInt(Integer.toString(julianDay).substring(2));
DateTime dt = new DateTime(0).withYear(year).withDayOfYear(day).withHourOfDay(0).withMinuteOfHour(0).withZoneRetainFields(DateTimeZone.forTimeZone(TimeZone.getTimeZone("UTC")));

由于第366天,它在上面最后一行失败。

问题显然不在Joda时间:

public static void main(String[] args)
{
    DateTime d = new DateTime(2013,12,31,23,59,52,DateTimeZone.UTC);
    System.out.println(d);
    System.out.println(d.getDayOfYear());
}
印刷品

2013-12-31T23:59:52.000Z
365
我建议您使用IDE调试器一步完成代码

(我知道这可能更像是一个注释,而不是一个答案,但很难将可读代码放入注释中)


(不确定最后的时区信息——Joda Time不是我的事。)

从回溯中可以看出,您试图在DayOfYear(366)内初始化DateTime对象。上面最后一行下面的那一行是什么?显示导致异常的代码(您的)。2013年不是闰年,是吗?请参见上面的编辑。另外,请容忍我-我正在调试其他人的代码。我意识到date.toString(“yyDDD”)实际上给了我所需要的,但当我使用它时,其他的计算结果就会出错。第405行是DateTime dt=新的日期时间(0)。withYear(年)。withDayOfYear(日)。withHourOfDay(0)。withMinuteOfHour(0)。WithZone包含字段(DateTimeZone.forTimeZone(TimeZone.getTimeZone(“UTC”))@有关366如何派生的更多代码信息,请参见上面的编辑2。这说明了吗?
public static void main(String[] args)
{
    DateTime d = new DateTime(2013,12,31,23,59,52,DateTimeZone.UTC);
    System.out.println(d);
    System.out.println(d.getDayOfYear());
}
2013-12-31T23:59:52.000Z
365
int julianDay = ((date.getYear() % 100) * 1000) + date.getDayOfYear();  // If you really need this

DateTime dt = new DateTime(0).withYear(date.getYear()).withDayOfYear(date.getDayOfYear()).withHourOfDay(0).withMinuteOfHour(0).withZoneRetainFields(DateTimeZone.forTimeZone(TimeZone.getTimeZone("UTC")));