2016-03-02 55 views
0

我正在使用Joda DateTime(2.9.2)的最新版本,当我尝试格式化为1/1/1582或更早版本的Java日期时,Joda无法正确格式化日期。下面是一个示例程序,以显示这一点:乔达未在15年1月1日或之前格式化日期?

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

Joda-Time中的默认值是预测公历日历。你将需要像'DateTime joda = new DateTime(dt,GJChronology.getInstance());' –

+0

这工作。谢谢。 –

回答

0

spec指定;

公历替换儒略历,并在当此年表交换机可以使用getInstance方法的第二 参数来控制 时间点。默认情况下,该切换设置为 公历首次设立之日起,10月15日,1582年

在此日期之前,这个年表使用proleptic儒略历 (无限期延长proleptic手段)。朱利安日历每四年跃升 年,而公历对 有100年和400年的特殊规则。因此将获得所有 输入值的有意义的结果。然而在公元8世纪之前,朱利安闰年是不规则的, 和公元前45年之前没有儒略历。

必须使用org.joda.time.chrono.GJChronology从10月15日早格式化日期,1582年

你可以尝试这样的;

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 
相关问题