Joda在15年1月1日或之前没有格式化日期?

时间:2016-03-02 15:11:54

标签: jodatime

我正在使用最新版本的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.

1 个答案:

答案 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