我正在使用最新版本的Joda DateTime(2.9.2),当我尝试格式化15月1日或更早的Java日期时,Joda没有正确格式化日期。以下是展示此内容的示例程序:
import java.util.*;
import java.text.*;
import org.joda.time.*;
import org.joda.time.format.*;
public class JodaTest {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date dt = sdf.parse("1/1/1582");
System.out.println("Date: " + dt);
System.out.println("Date Formatted via SDF: " + sdf.format(dt));
DateTime joda = new DateTime(dt);
DateTimeFormatter fmt = DateTimeFormat.forPattern("dd-MMM-yy");
fmt.withLocale(Locale.US);
System.out.println("Joda: " + fmt.print(joda));
}
}
输出:
Date: Mon Jan 01 00:00:00 EST 1582
Date Formatted via SDF: 01/01/1582
Joda: 11-Jan-82
SimpleDateFormat formats the date correctly as 1/1/1582 but Joda formats it as 1/11/1582.
答案 0 :(得分:0)
如spec;
中所述格里高利历取代了朱利安历法,并取代了 这个年表切换的时间可以用秒来控制 getInstance方法的参数。默认情况下,此切换设置为 10月15日格里高利历首次提出的日期, 1582。
在此日期之前,此年表使用了预言朱利安历法 (预防意味着无限期延长)。朱利安历法有了飞跃 每四年一次,而格里高利人则有特殊的规则 100年和400年。因此,将为所有人获得有意义的结果 输入值。然而,在公元8年之前,朱利安的闰年是不规则的, 在公元前45年之前,没有朱利安历法。
您必须使用org.joda.time.chrono.GJChronology
格式化1582年10月15日之前的日期。
你可以这样试试;
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date dt = sdf.parse("1/1/1582");
System.out.println("Date: " + dt);
System.out.println("Date Formatted via SDF: " + sdf.format(dt));
DateTime joda = new DateTime(dt, GJChronology.getInstance());
DateTimeFormatter fmt = DateTimeFormat.forPattern("dd-MMM-yy");
fmt.withLocale(Locale.US);
System.out.println("Joda: " + fmt.print(joda));
}
输出是;
Date: Mon Jan 01 00:00:00 VET 1582
Date Formatted via SDF: 01/01/1582
Joda: 01-Oca-82