一个日期转换的问题


想把一个字符串转换为日期类型,用了SimpleDateFormat进行转换,结果发现在转换19910414这个日期时,会报错。不知道是什么原因,哪位高手指点一下。

运行环境:jdk1.5.0_13

代码如下:

import java.util.Date;
import java.text.SimpleDateFormat;

public class TestMain {

public static void main(String[] args) {
       SimpleDateFormat vsdf = null;
       Date vdate = null;
           
       vsdf = new SimpleDateFormat("yyyyMMddhhmmss");
       vsdf.setLenient(false);

       try{
           
         vdate = vsdf.parse("19910414000000");
                    
       }
       catch(Exception e){
      
         e.printStackTrace();
                    
       }
           
       System.out.println(vdate);
}
      
}

附:
19400603000000
19410316000000
19860504000000
19870412000000
19880410000000
19890416000000
19900415000000
19910414000000
这几个在转换时也有问题。

[[i] 本帖最后由 ppbear0404 于 2008-1-2 18:11 编辑 [/i]]

2008-1-3 00:28 seraphin
1.4下运行没问题。


2008-1-3 00:29 greenflute
[code]package test;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeFormatTest {
       public static void main(String[] args) {
            testformat("19400603000000" );
            testformat("19410316000000" );
            testformat("19860504000000" );
            testformat("19870412000000" );
            testformat("19880410000000" );
            testformat("19890416000000" );
            testformat("19900415000000" );
            testformat("19910414000000" );
       }

       public static void testformat(String s) {
            SimpleDateFormat vsdf = null;
            Date vdate = null;

            vsdf = new SimpleDateFormat("yyyyMMddhhmmss");
            vsdf.setLenient(false);

            try {

                     vdate = vsdf.parse(s);

            } catch (Exception e) {

                     e.printStackTrace();

            }
            System.out.println(s);
            System.out.println(vdate);
            System.out.println();
       }
}[/code][code]19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CEST 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991[/code]


2008-1-3 00:42 greenflute
Aktive Codepage: 850.
D:/>/javasoft/j2se/1.3.1/bin/java -version
[b]java version "1.3.1_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_18-b01)
Java HotSpot(TM) Client VM (build 1.3.1_18-b01, mixed mode)[/b]

D:/>/javasoft/j2se/1.3.1/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.3.1/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CET 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/>
D:/>/javasoft/j2se/1.4.2/bin/java -version
[b]java version "1.4.2_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_11-b06)
Java HotSpot(TM) Client VM (build 1.4.2_11-b06, mixed mode)[/b]

D:/>/javasoft/j2se/1.4.2/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.4.2/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CEST 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/>
D:/>/javasoft/j2se/1.5.0/bin/java -version
[b]java version "1.5.0_10"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)[/b]

D:/>/javasoft/j2se/1.5.0/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.5.0/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CEST 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/>
D:/>/javasoft/j2se/1.6.0/bin/java -version
[b]java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)[/b]

D:/>/javasoft/j2se/1.6.0/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.6.0/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CEST 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/>


2008-1-3 07:56 ppbear0404
是不是可以认为是一个bug?


2008-1-3 11:09 iooyoo
贴一下错误信息


2008-1-3 11:45 马甲走江湖
null
java.text.ParseException: Unparseable date: "19400603000000"
at java.text.DateFormat.parse(DateFormat.java:337)
at com.itpub.test.TestMain.main(TestMain.java:23)


2008-1-3 12:28 asangel
版本挺全的
[quote]原帖由 [i]greenflute[/i] 于 2008-1-3 00:42 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=9320331&ptid=920365][img]http://www.itpub.net/images/common/back.gif[/img][/url]
Aktive Codepage: 850.
D:/>/javasoft/j2se/1.3.1/bin/java -version
java version "1.3.1_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_18-b01)
Java HotSpot(TM) Client VM (build 1.3.1_18-b01, mixed mode)

D:/>/javasoft/j2se/1.3.1/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.3.1/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CET 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/>
D:/>/javasoft/j2se/1.4.2/bin/java -version
java version "1.4.2_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_11-b06)
Java HotSpot(TM) Client VM (build 1.4.2_11-b06, mixed mode)

D:/>/javasoft/j2se/1.4.2/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.4.2/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CEST 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/>
D:/>/javasoft/j2se/1.5.0/bin/java -version
java version "1.5.0_10"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)

D:/>/javasoft/j2se/1.5.0/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.5.0/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CEST 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/>
D:/>/javasoft/j2se/1.6.0/bin/java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)

D:/>/javasoft/j2se/1.6.0/bin/javac TimeFormatTest.java

D:/>/javasoft/j2se/1.6.0/bin/java -cp . TimeFormatTest
19400603000000
Mon Jun 03 00:00:00 CEST 1940

19410316000000
Sun Mar 16 00:00:00 CEST 1941

19860504000000
Sun May 04 00:00:00 CEST 1986

19870412000000
Sun Apr 12 00:00:00 CEST 1987

19880410000000
Sun Apr 10 00:00:00 CEST 1988

19890416000000
Sun Apr 16 00:00:00 CEST 1989

19900415000000
Sun Apr 15 00:00:00 CEST 1990

19910414000000
Sun Apr 14 00:00:00 CEST 1991


D:/> [/quote]


2008-1-3 17:15 ppbear0404
今天测试了一下,jdk1.5及以上版本都会报错。这和测试所用的操作系统还有关系么?


2008-1-3 19:59 iooyoo
jdk_1.5.0_12
[code]
public class TestMain {
static void test1() {
       SimpleDateFormat vsdf = null;
       Date vdate = null;
       vsdf = new SimpleDateFormat("yyyyMMddhhmmss");
       vsdf.setLenient(false);
       try {
         vdate = vsdf.parse("19910414000000");
       }
       catch (Exception e) {
         e.printStackTrace();
       }
       System.out.println(vdate);
}

static void test2() {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
       try {
         Date date = sdf.parse("19910414000000");
         System.out.println(date);
       }
       catch (ParseException e) {
         e.printStackTrace();
       }
}

static void test3() {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
       try {
         Date date = sdf.parse("19910414000000");
         System.out.println(date);
       }
       catch (ParseException e) {
         e.printStackTrace();
       }
}

public static void main(String[] args) {
       test1();
       try {
         Thread.sleep(2000);
       }
       catch (InterruptedException e) {
       }
       test2();
       try {
         Thread.sleep(2000);
       }
       catch (InterruptedException e) {
       }
       test3();
}
}
[/code]

null
java.text.ParseException: Unparseable date: "19910414000000"
at java.text.DateFormat.parse(Unknown Source)
at com.iooyoo.comics.TestMain.test1(TestMain.java:14)
at com.iooyoo.comics.TestMain.main(TestMain.java:45)
Sun Apr 14 01:00:00 CST 1991
Sun Apr 14 01:00:00 CST 1991


2008-1-3 23:08 greenflute
[quote]原帖由 [i]iooyoo[/i] 于 2008-1-3 19:59 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=9328878&ptid=920365][img]http://www.itpub.net/images/common/back.gif[/img][/url]
[color=Red]jdk_1.5.0_12[/color]

public class TestMain {
static void test1() {
       SimpleDateFormat vsdf = null;
       Date vdate = null;
       vsdf = new SimpleDateFormat("yyyyMMddhhmmss");
       vsdf.setLenient(false);
       try {
         [color=Red]vdate = vsdf.parse("19910414000000");[/color]
       }
       catch (Exception e) {
         e.printStackTrace();
       }
       System.out.println(vdate);
}

static void test2() {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
       try {
         [color=Red]Date date = sdf.parse("19910414000000");[/color]
         System.out.println(date);
       }
       catch (ParseException e) {
         e.printStackTrace();
       }
}

static void test3() {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
       try {
         [color=Red]Date date = sdf.parse("19910414000000");[/color]
         System.out.println(date);
       }
       catch (ParseException e) {
         e.printStackTrace();
       }
}

public static void main(String[] args) {
       test1();
       try {
         Thread.sleep(2000);
       }
       catch (InterruptedException e) {
       }
       test2();
       try {
         Thread.sleep(2000);
       }
       catch (InterruptedException e) {
       }
       test3();
}
}


[color=Red]null
java.text.ParseException: Unparseable date: "19910414000000"
at java.text.DateFormat.parse(Unknown Source)
at com.iooyoo.comics.TestMain.test1(TestMain.java:14)
at com.iooyoo.comics.TestMain.main(TestMain.java:45)[/color]
Sun Apr 14 01:00:00 CST 1991
Sun Apr 14 01:00:00 CST 1991 [/quote]

一个是jdk1.5.0_13,一个是jdk1.5.0_12,真的怀疑是这几个版本的bug了:idle: :idle:


2008-1-4 09:20 iooyoo
回去试了一下,好像不是,这个时间点有点问题,不知道楼主怎么试出来这个的


2008-1-4 09:29 iooyoo
似乎 1991-4-14 00:00:00 和 1991-4-14 01:00:00没有区别
[code]

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TestMain {
private static SimpleDateFormat format = new SimpleDateFormat(
         "yyyy-MM-dd HH:mm:ss");

public static void main(String[] args) {
       test4(1991, 3, 14, 2, 0, 0, -1);
       test4(1991, 3, 14, 2, 0, 0, -2);
       test4(1991, 3, 14, 2, 0, 0, -3);
       test4(1991, 3, 14, 0, 0, 0, -1);
       System.out.println();
       test4(1992, 3, 15, 2, 0, 0, -1);
       test4(1992, 3, 15, 2, 0, 0, -2);
       test4(1992, 3, 15, 2, 0, 0, -3);
       test4(1992, 3, 15, 0, 0, 0, -1);
       System.out.println();
       test4(1991, 4, 14, 2, 0, 0, -1);
       test4(1991, 4, 14, 2, 0, 0, -2);
       test4(1991, 4, 14, 2, 0, 0, -3);
       test4(1991, 4, 14, 0, 0, 0, -1);
       System.out.println();
       test4(1992, 3, 15, 2, 0, 0, -1);
       test4(1992, 3, 15, 2, 0, 0, -2);
       test4(1992, 3, 15, 2, 0, 0, -3);
       test4(1992, 3, 15, 0, 0, 0, -1);
}

static void test4(int year, int month, int day, int hour, int minute,
         int second, int hourAmount) {
       GregorianCalendar gc = new GregorianCalendar();
       gc.set(year, month, day, hour, minute, second);

       GregorianCalendar gc1 = new GregorianCalendar();
       gc1.setTimeInMillis(gc.getTimeInMillis());
       gc1.add(Calendar.HOUR, hourAmount);

       long t1 = gc.getTimeInMillis() - gc1.getTimeInMillis();
       System.out.println(format.format(gc.getTime()) + " to "
            + format.format(gc1.getTime()) + " is " + t1 / 1000L / 60
            + " minutes.");
}
}
--------------------------
1991-04-14 02:00:00 to 1991-04-14 01:00:00 is 60 minutes.
1991-04-14 02:00:00 to 1991-04-13 23:00:00 is 120 minutes.
1991-04-14 02:00:00 to 1991-04-13 22:00:00 is 180 minutes.
1991-04-14 01:00:00 to 1991-04-13 23:00:00 is 60 minutes.

1992-04-15 02:00:00 to 1992-04-15 01:00:00 is 60 minutes.
1992-04-15 02:00:00 to 1992-04-15 00:00:00 is 120 minutes.
1992-04-15 02:00:00 to 1992-04-14 23:00:00 is 180 minutes.
1992-04-15 00:00:00 to 1992-04-14 23:00:00 is 60 minutes.

1991-05-14 02:00:00 to 1991-05-14 01:00:00 is 60 minutes.
1991-05-14 02:00:00 to 1991-05-14 00:00:00 is 120 minutes.
1991-05-14 02:00:00 to 1991-05-13 23:00:00 is 180 minutes.
1991-05-14 00:00:00 to 1991-05-13 23:00:00 is 60 minutes.

1992-04-15 02:00:00 to 1992-04-15 01:00:00 is 60 minutes.
1992-04-15 02:00:00 to 1992-04-15 00:00:00 is 120 minutes.
1992-04-15 02:00:00 to 1992-04-14 23:00:00 is 180 minutes.
1992-04-15 00:00:00 to 1992-04-14 23:00:00 is 60 minutes.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值