想把一个字符串转换为日期类型,用了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]]
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]
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:/>
java.text.ParseException: Unparseable date: "19400603000000"
at java.text.DateFormat.parse(DateFormat.java:337)
at com.itpub.test.TestMain.main(TestMain.java:23)
[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]
[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
[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:
[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.