如题,测试代码如下:
代码:
Date dt = Date.valueOf("123945-06-09");
System.out.println(dt.toString());
结果:
945-06-09不知该问题是否为JDK 1.6的问题,哪位若发现过JDK中的说明,请最好能给我地址的链接,谢谢。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【moonck】截止到2008-07-22 13:06:48的历史汇总数据(不包括此帖):
    发帖的总数量:6                        发帖的总分数:100                      每贴平均分数:16                       
    回帖的总数量:7                        得分贴总数量:1                        回帖的得分率:14%                      
    结贴的总数量:6                        结贴的总分数:100                      
    无满意结贴数:1                        无满意结贴分:20                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:16.67 %               无满意结分率:20.00 %                  
    敬礼!
      

  2.   

    正常年份的范围是什么呀?1~9999吗?
    但是,大于9999时JDK为何返回的是我测试出来的结果,想知道原因或者JDK中明确说明的内容。
      

  3.   

    这样试试
    public static void main(String[] args) throws Exception
    {

    String str = "123945-06-09";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
    Date d = sdf.parse(str);
    System.out.println(sdf.format(d));
    }
      

  4.   

        public static Date valueOf(String s) {
    int year;
    int month;
    int day;
    int firstDash;
    int secondDash; if (s == null) throw new java.lang.IllegalArgumentException(); firstDash = s.indexOf('-');
    secondDash = s.indexOf('-', firstDash+1);
    if ((firstDash > 0) & (secondDash > 0) & (secondDash < s.length()-1)) {
        year = Integer.parseInt(s.substring(0, firstDash)) - 1900;
        month = Integer.parseInt(s.substring(firstDash+1, secondDash)) - 1;
        day = Integer.parseInt(s.substring(secondDash+1));  
    } else {
        throw new java.lang.IllegalArgumentException();
    }

    return new Date(year, month, day);
        }这是jdk5.0的做法,你最好看看6.0是怎么做的。
      

  5.   

    另外,说一下,是java.sql.Date 而非java.util.date。
      

  6.   

    是 java.sql.Date.toString() 方法的原因,此方法源代码如下,注意中间我加的注释:public String toString () {
    int year = super.getYear() + 1900;
    int month = super.getMonth() + 1;
    int day = super.getDate();
    //执行到此处取出的 year month day 分别为 123945 6 9 一切正常
    //是下面代码出的问题
    char buf[] = "2000-00-00".toCharArray();
    buf[0] = Character.forDigit(year/1000,10);
    buf[1] = Character.forDigit((year/100)%10,10);
    buf[2] = Character.forDigit((year/10)%10,10);
    buf[3] = Character.forDigit(year%10,10);
    buf[5] = Character.forDigit(month/10,10);
    buf[6] = Character.forDigit(month%10,10);
    buf[8] = Character.forDigit(day/10,10);
    buf[9] = Character.forDigit(day%10,10);
    return new String(buf);
    }你可以用下面代码试试,它能证明在 Date 对象内部存储的值正确,只是最后 toString() 时出现问题了 System.out.println(dt.getYear() + 1900);
    System.out.println(dt.getMonth() + 1);
    System.out.println(dt.getDate());
      

  7.   

    恩,经过一番调查又有新的发现了。
    如下的方式输出时就是对的了。Java code
    Date dt = Date.valueOf("123945-06-09");
    System.out.println(dt.toLocaleString());结果:
    123945/06/09 0:00:00但是toLocaleString()方法在JDK1.6中已经不推荐使用了,
    为何使用toString()方法返回的却是945-06-09。
      

  8.   

    这是 java.sql.Date.toString() 方法的一个 Bug,参见:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4510956
      

  9.   


    此 Bug 的状态是 Fix Delivered - The changeset or fix has been integrated into the master area and will show up in the next build promotion.
      

  10.   

    呵呵,原来是JDK的Bug。
    谢谢各位,现在开始给分了。