ICU-93 DateFormat test porting and bug fixing
X-SVN-Rev: 6325
This commit is contained in:
parent
459c83c36f
commit
b11ff6da0b
849
icu4j/src/com/ibm/icu/dev/test/format/DateFormatRegressionTest.java
Executable file
849
icu4j/src/com/ibm/icu/dev/test/format/DateFormatRegressionTest.java
Executable file
@ -0,0 +1,849 @@
|
||||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2001, International Business Machines Corporation and *
|
||||
* others. All Rights Reserved. *
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Port From: ICU4C v1.8.1 : format : DateFormatRegressionTest
|
||||
* Source File: $ICU4CRoot/source/test/intltest/dtfmrgts.cpp
|
||||
**/
|
||||
|
||||
package com.ibm.icu.test.format;
|
||||
|
||||
import com.ibm.text.*;
|
||||
import com.ibm.util.*;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
import java.text.FieldPosition;
|
||||
import java.text.ParseException;
|
||||
import java.text.ParsePosition;
|
||||
import java.text.Format;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* Performs regression test for DateFormat
|
||||
**/
|
||||
public class DateFormatRegressionTest extends com.ibm.test.TestFmwk {
|
||||
|
||||
public static void main(String[] args) throws Exception{
|
||||
new DateFormatRegressionTest().run(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4029195
|
||||
*/
|
||||
public void Test4029195() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
Date today = cal.getTime();
|
||||
logln("today: " + today);
|
||||
SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance();
|
||||
String pat = sdf.toPattern();
|
||||
logln("pattern: " + pat);
|
||||
StringBuffer fmtd = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
fmtd = sdf.format(today, fmtd, pos);
|
||||
logln("today: " + fmtd);
|
||||
|
||||
sdf.applyPattern("G yyyy DDD");
|
||||
StringBuffer todayS = new StringBuffer("");
|
||||
todayS = sdf.format(today, todayS, pos);
|
||||
logln("today: " + todayS);
|
||||
try {
|
||||
today = sdf.parse(todayS.toString());
|
||||
logln("today date: " + today);
|
||||
} catch (Exception e) {
|
||||
errln("Error reparsing date: " + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
StringBuffer rt = new StringBuffer("");
|
||||
rt = sdf.format(sdf.parse(todayS.toString()), rt, pos);
|
||||
logln("round trip: " + rt);
|
||||
if (!rt.toString().equals(todayS.toString()))
|
||||
errln("Fail: Want " + todayS + " Got " + rt);
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4052408
|
||||
*/
|
||||
public void Test4052408() {
|
||||
|
||||
DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US);
|
||||
Date dt = new Date(97, Calendar.MAY, 3, 8, 55);
|
||||
String str = fmt.format(dt);
|
||||
logln(str);
|
||||
|
||||
if (!str.equals("5/3/97 8:55 AM"))
|
||||
errln("Fail: Test broken; Want 5/3/97 8:55 AM Got " + str);
|
||||
|
||||
String expected[] = {
|
||||
"", //"ERA_FIELD",
|
||||
"97", //"YEAR_FIELD",
|
||||
"5", //"MONTH_FIELD",
|
||||
"3", //"DATE_FIELD",
|
||||
"", //"HOUR_OF_DAY1_FIELD",
|
||||
"", //"HOUR_OF_DAY0_FIELD",
|
||||
"55", //"MINUTE_FIELD",
|
||||
"", //"SECOND_FIELD",
|
||||
"", //"MILLISECOND_FIELD",
|
||||
"", //"DAY_OF_WEEK_FIELD",
|
||||
"", //"DAY_OF_YEAR_FIELD",
|
||||
"", //"DAY_OF_WEEK_IN_MONTH_FIELD",
|
||||
"", //"WEEK_OF_YEAR_FIELD",
|
||||
"", //"WEEK_OF_MONTH_FIELD",
|
||||
"AM", //"AM_PM_FIELD",
|
||||
"8", //"HOUR1_FIELD",
|
||||
"", //"HOUR0_FIELD",
|
||||
"" //"TIMEZONE_FIELD"
|
||||
};
|
||||
String fieldNames[] = {
|
||||
"ERA_FIELD",
|
||||
"YEAR_FIELD",
|
||||
"MONTH_FIELD",
|
||||
"DATE_FIELD",
|
||||
"HOUR_OF_DAY1_FIELD",
|
||||
"HOUR_OF_DAY0_FIELD",
|
||||
"MINUTE_FIELD",
|
||||
"SECOND_FIELD",
|
||||
"MILLISECOND_FIELD",
|
||||
"DAY_OF_WEEK_FIELD",
|
||||
"DAY_OF_YEAR_FIELD",
|
||||
"DAY_OF_WEEK_IN_MONTH_FIELD",
|
||||
"WEEK_OF_YEAR_FIELD",
|
||||
"WEEK_OF_MONTH_FIELD",
|
||||
"AM_PM_FIELD",
|
||||
"HOUR1_FIELD",
|
||||
"HOUR0_FIELD",
|
||||
"TIMEZONE_FIELD"};
|
||||
|
||||
boolean pass = true;
|
||||
for (int i = 0; i <= 17; ++i) {
|
||||
FieldPosition pos = new FieldPosition(i);
|
||||
StringBuffer buf = new StringBuffer("");
|
||||
fmt.format(dt, buf, pos);
|
||||
//char[] dst = new char[pos.getEndIndex() - pos.getBeginIndex()];
|
||||
String dst = buf.substring(pos.getBeginIndex(), pos.getEndIndex());
|
||||
str = dst;
|
||||
log(i + ": " + fieldNames[i] + ", \"" + str + "\", "
|
||||
+ pos.getBeginIndex() + ", " + pos.getEndIndex());
|
||||
String exp = expected[i];
|
||||
if ((exp.length() == 0 && str.length() == 0) || str.equals(exp))
|
||||
logln(" ok");
|
||||
else {
|
||||
logln(" expected " + exp);
|
||||
pass = false;
|
||||
}
|
||||
}
|
||||
if (!pass)
|
||||
errln("Fail: FieldPosition not set right by DateFormat");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4056591
|
||||
* Verify the function of the [s|g]et2DigitYearStart() API.
|
||||
*/
|
||||
public void Test4056591() {
|
||||
|
||||
try {
|
||||
SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd", Locale.US);
|
||||
Date start = new Date(1809-1900, Calendar.DECEMBER, 25);
|
||||
fmt.set2DigitYearStart(start);
|
||||
if ((fmt.get2DigitYearStart() != start))
|
||||
errln("get2DigitYearStart broken");
|
||||
Date dates[] = {
|
||||
new Date(1809 - 1900, Calendar.DECEMBER, 25),
|
||||
new Date(1909 - 1900, Calendar.DECEMBER, 24),
|
||||
new Date(1809 - 1900, Calendar.DECEMBER, 26),
|
||||
new Date(1861 - 1900, Calendar.DECEMBER, 25), };
|
||||
|
||||
String strings[] = {"091225", "091224", "091226", "611225"};
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
String s = strings[i];
|
||||
Date exp = dates[i];
|
||||
Date got = fmt.parse(s);
|
||||
logln(s + " . " + got + "; exp " + exp);
|
||||
if (got.getTime() != exp.getTime())
|
||||
errln("set2DigitYearStart broken");
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4059917
|
||||
*/
|
||||
public void Test4059917() {
|
||||
SimpleDateFormat fmt;
|
||||
String myDate;
|
||||
fmt = new SimpleDateFormat("yyyy/MM/dd");
|
||||
myDate = "1997/01/01";
|
||||
aux917( fmt, myDate );
|
||||
fmt = new SimpleDateFormat("yyyyMMdd");
|
||||
myDate = "19970101";
|
||||
aux917( fmt, myDate );
|
||||
}
|
||||
|
||||
public void aux917(SimpleDateFormat fmt, String str) {
|
||||
|
||||
String pat = fmt.toPattern();
|
||||
logln("==================");
|
||||
logln("testIt: pattern=" + pat + " string=" + str);
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
Object o = fmt.parseObject(str, pos);
|
||||
//logln( UnicodeString("Parsed object: ") + o );
|
||||
|
||||
StringBuffer formatted = new StringBuffer("");
|
||||
FieldPosition poss = new FieldPosition(0);
|
||||
formatted = fmt.format(o, formatted, poss);
|
||||
|
||||
logln("Formatted string: " + formatted);
|
||||
if (!formatted.toString().equals(str))
|
||||
errln("Fail: Want " + str + " Got " + formatted);
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4060212
|
||||
*/
|
||||
public void Test4060212() {
|
||||
String dateString = "1995-040.05:01:29";
|
||||
logln("dateString= " + dateString);
|
||||
logln("Using yyyy-DDD.hh:mm:ss");
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-DDD.hh:mm:ss");
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
Date myDate = formatter.parse(dateString, pos);
|
||||
DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.LONG);
|
||||
String myString = fmt.format(myDate);
|
||||
logln(myString);
|
||||
Calendar cal = new GregorianCalendar();
|
||||
cal.setTime(myDate);
|
||||
if ((cal.get(Calendar.DAY_OF_YEAR) != 40))
|
||||
errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40");
|
||||
|
||||
logln("Using yyyy-ddd.hh:mm:ss");
|
||||
formatter = new SimpleDateFormat("yyyy-ddd.hh:mm:ss");
|
||||
pos.setIndex(0);
|
||||
myDate = formatter.parse(dateString, pos);
|
||||
myString = fmt.format(myDate);
|
||||
logln(myString);
|
||||
cal.setTime(myDate);
|
||||
if ((cal.get(Calendar.DAY_OF_YEAR) != 40))
|
||||
errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40");
|
||||
}
|
||||
/**
|
||||
* @bug 4061287
|
||||
*/
|
||||
public void Test4061287() {
|
||||
|
||||
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
|
||||
try {
|
||||
logln(df.parse("35/01/1971").toString());
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
df.setLenient(false);
|
||||
boolean ok = false;
|
||||
try {
|
||||
logln(df.parse("35/01/1971").toString());
|
||||
} catch (ParseException e) {
|
||||
ok = true;
|
||||
}
|
||||
if (!ok)
|
||||
errln("Fail: Lenient not working");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4065240
|
||||
*/
|
||||
public void Test4065240() {
|
||||
Date curDate;
|
||||
DateFormat shortdate, fulldate;
|
||||
String strShortDate, strFullDate;
|
||||
Locale saveLocale = Locale.getDefault();
|
||||
TimeZone saveZone = TimeZone.getDefault();
|
||||
|
||||
try {
|
||||
Locale curLocale = new Locale("de", "DE");
|
||||
Locale.setDefault(curLocale);
|
||||
// {sfb} adoptDefault instead of setDefault
|
||||
//TimeZone.setDefault(TimeZone.createTimeZone("EST"));
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("EST"));
|
||||
curDate = new Date(98, 0, 1);
|
||||
shortdate = DateFormat.getDateInstance(DateFormat.SHORT);
|
||||
fulldate = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
|
||||
strShortDate = "The current date (short form) is ";
|
||||
String temp;
|
||||
temp = shortdate.format(curDate);
|
||||
strShortDate += temp;
|
||||
strFullDate = "The current date (long form) is ";
|
||||
String temp2 = fulldate.format(curDate);
|
||||
strFullDate += temp2;
|
||||
|
||||
logln(strShortDate);
|
||||
logln(strFullDate);
|
||||
|
||||
// {sfb} What to do with resource bundle stuff?????
|
||||
|
||||
// Check to see if the resource is present; if not, we can't test
|
||||
ResourceBundle bundle =
|
||||
ResourceBundle.getBundle("java.text.resources.DateFormatZoneData", curLocale);
|
||||
|
||||
// {sfb} API change to ResourceBundle -- add getLocale()
|
||||
/*if (bundle.getLocale().getLanguage().equals("de")) {
|
||||
// UPDATE THIS AS ZONE NAME RESOURCE FOR <EST> in de_DE is updated
|
||||
if (!strFullDate.endsWith("GMT-05:00"))
|
||||
errln("Fail: Want GMT-05:00");
|
||||
} else {
|
||||
logln("*** TEST COULD NOT BE COMPLETED BECAUSE DateFormatZoneData ***");
|
||||
logln("*** FOR LOCALE de OR de_DE IS MISSING ***");
|
||||
}*/
|
||||
} catch (Exception e) {
|
||||
|
||||
} finally {
|
||||
Locale.setDefault(saveLocale);
|
||||
TimeZone.setDefault(saveZone);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
DateFormat.equals is too narrowly defined. As a result, MessageFormat
|
||||
does not work correctly. DateFormat.equals needs to be written so
|
||||
that the Calendar sub-object is not compared using Calendar.equals,
|
||||
but rather compared for equivalency. This may necessitate adding a
|
||||
(package private) method to Calendar to test for equivalency.
|
||||
|
||||
Currently this bug breaks MessageFormat.toPattern
|
||||
*/
|
||||
/**
|
||||
* @bug 4071441
|
||||
*/
|
||||
public void Test4071441() {
|
||||
DateFormat fmtA = DateFormat.getInstance();
|
||||
DateFormat fmtB = DateFormat.getInstance();
|
||||
|
||||
// {sfb} Is it OK to cast away const here?
|
||||
Calendar calA = fmtA.getCalendar();
|
||||
Calendar calB = fmtB.getCalendar();
|
||||
Date epoch = new Date(0, 0, 0);
|
||||
Date xmas = new Date(61, Calendar.DECEMBER, 25);
|
||||
|
||||
calA.setTime(epoch);
|
||||
calB.setTime(epoch);
|
||||
|
||||
if (!calA.equals(calB))
|
||||
errln("Fail: Can't complete test; Calendar instances unequal");
|
||||
if (!fmtA.equals(fmtB))
|
||||
errln("Fail: DateFormat unequal when Calendars equal");
|
||||
calB.setTime(xmas);
|
||||
if (calA.equals(calB))
|
||||
errln("Fail: Can't complete test; Calendar instances equal");
|
||||
if (!fmtA.equals(fmtB))
|
||||
errln("Fail: DateFormat unequal when Calendars equivalent");
|
||||
logln("DateFormat.equals ok");
|
||||
}
|
||||
|
||||
/* The java.text.DateFormat.parse(String) method expects for the
|
||||
US locale a string formatted according to mm/dd/yy and parses it
|
||||
correctly.
|
||||
|
||||
When given a string mm/dd/yyyy it only parses up to the first
|
||||
two y's, typically resulting in a date in the year 1919.
|
||||
|
||||
Please extend the parsing method(s) to handle strings with
|
||||
four-digit year values (probably also applicable to various
|
||||
other locales. */
|
||||
/**
|
||||
* @bug 4073003
|
||||
*/
|
||||
public void Test4073003() {
|
||||
try {
|
||||
DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
|
||||
String tests[] = {"12/25/61", "12/25/1961", "4/3/2010", "4/3/10"};
|
||||
for (int i = 0; i < 4; i += 2) {
|
||||
Date d = fmt.parse(tests[i]);
|
||||
Date dd = fmt.parse(tests[i + 1]);
|
||||
String s;
|
||||
s = fmt.format(d);
|
||||
String ss;
|
||||
ss = fmt.format(dd);
|
||||
if (d.getTime() != dd.getTime())
|
||||
errln("Fail: " + d + " != " + dd);
|
||||
if (!s.equals(ss))
|
||||
errln("Fail: " + s + " != " + ss);
|
||||
logln("Ok: " + s + " " + d);
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4089106
|
||||
*/
|
||||
public void Test4089106() {
|
||||
TimeZone def = TimeZone.getDefault();
|
||||
try {
|
||||
TimeZone z = new SimpleTimeZone((int) (1.25 * 3600000), "FAKEZONE");
|
||||
TimeZone.setDefault(z);
|
||||
SimpleDateFormat f = new SimpleDateFormat();
|
||||
if (!f.getTimeZone().equals(z))
|
||||
errln("Fail: SimpleTimeZone should use TimeZone.getDefault()");
|
||||
} finally {
|
||||
TimeZone.setDefault(def);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4100302
|
||||
*/
|
||||
public void Test4100302() {
|
||||
|
||||
Locale locales[] = {
|
||||
Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA,
|
||||
Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH,
|
||||
Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY,
|
||||
Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN,
|
||||
Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN,
|
||||
Locale.TRADITIONAL_CHINESE, Locale.UK, Locale.US};
|
||||
try {
|
||||
boolean pass = true;
|
||||
for (int i = 0; i < 21; i++) {
|
||||
Format format = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locales[i]);
|
||||
byte[] bytes;
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
oos.writeObject(format);
|
||||
oos.flush();
|
||||
baos.close();
|
||||
bytes = baos.toByteArray();
|
||||
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
|
||||
Object o = ois.readObject();
|
||||
if (!format.equals(o)) {
|
||||
pass = false;
|
||||
logln("DateFormat instance for locale " + locales[i] + " is incorrectly serialized/deserialized.");
|
||||
} else {
|
||||
logln("DateFormat instance for locale " + locales[i] + " is OKAY.");
|
||||
}
|
||||
}
|
||||
if (!pass)
|
||||
errln("Fail: DateFormat serialization/equality bug");
|
||||
} catch (OptionalDataException e) {
|
||||
errln("Fail: " + e);
|
||||
} catch (IOException e) {
|
||||
errln("Fail: " + e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
errln("Fail: " + e);
|
||||
} catch (Exception e) {
|
||||
errln("Fail: " + e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4101483
|
||||
*/
|
||||
public void Test4101483() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("z", Locale.US);
|
||||
FieldPosition fp = new FieldPosition(DateFormat.TIMEZONE_FIELD);
|
||||
Date d = new Date(9234567890L);
|
||||
StringBuffer buf = new StringBuffer("");
|
||||
sdf.format(d, buf, fp);
|
||||
logln(sdf.format(d, buf, fp).toString());
|
||||
logln("beginIndex = " + fp.getBeginIndex());
|
||||
logln("endIndex = " + fp.getEndIndex());
|
||||
if (fp.getBeginIndex() == fp.getEndIndex())
|
||||
errln("Fail: Empty field");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4103340
|
||||
* @bug 4138203
|
||||
* This bug really only works in Locale.US, since that's what the locale
|
||||
* used for Date.toString() is. Bug 4138203 reports that it fails on Korean
|
||||
* NT; it would actually have failed on any non-US locale. Now it should
|
||||
* work on all locales.
|
||||
*/
|
||||
public void Test4103340() {
|
||||
|
||||
// choose a date that is the FIRST of some month
|
||||
// and some arbitrary time
|
||||
Date d = new Date(97, 3, 1, 1, 1, 1);
|
||||
SimpleDateFormat df = new SimpleDateFormat("MMMM", Locale.US);
|
||||
String s = d.toString();
|
||||
StringBuffer s2 = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
s2 = df.format(d, s2, pos);
|
||||
logln("Date=" + s);
|
||||
logln("DF=" + s2);
|
||||
String substr = s2.substring(0,2);
|
||||
if (s.indexOf(substr) == -1)
|
||||
errln("Months should match");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4103341
|
||||
*/
|
||||
public void Test4103341() {
|
||||
TimeZone saveZone = TimeZone.getDefault();
|
||||
try {
|
||||
// {sfb} changed from adoptDefault to setDefault
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("CST"));
|
||||
SimpleDateFormat simple = new SimpleDateFormat("MM/dd/yyyy HH:mm");
|
||||
TimeZone temp = TimeZone.getDefault();
|
||||
if (!simple.getTimeZone().equals(temp))
|
||||
errln("Fail: SimpleDateFormat not using default zone");
|
||||
} finally {
|
||||
TimeZone.setDefault(saveZone);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4104136
|
||||
*/
|
||||
public void Test4104136() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat();
|
||||
String pattern = "'time' hh:mm";
|
||||
sdf.applyPattern(pattern);
|
||||
logln("pattern: \"" + pattern + "\"");
|
||||
String strings[] = {"time 10:30", "time 10:x", "time 10x"};
|
||||
ParsePosition ppos[] = {new ParsePosition(10), new ParsePosition(0), new ParsePosition(0)};
|
||||
Date dates[] = {new Date(70, Calendar.JANUARY, 1, 10, 30), new Date(-1), new Date(-1)};
|
||||
for (int i = 0; i < 3; i++) {
|
||||
String text = strings[i];
|
||||
ParsePosition finish = ppos[i];
|
||||
Date exp = dates[i];
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
Date d = sdf.parse(text, pos);
|
||||
logln(" text: \"" + text + "\"");
|
||||
logln(" index: %d" + pos.getIndex());
|
||||
logln(" result: " + d);
|
||||
if (pos.getIndex() != finish.getIndex())
|
||||
errln("Fail: Expected pos " + finish.getIndex());
|
||||
if (!((d == null && exp.equals(new Date(-1))) || (d.equals(exp))))
|
||||
errln( "Fail: Expected result " + exp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4104522
|
||||
* CANNOT REPRODUCE
|
||||
* According to the bug report, this test should throw a
|
||||
* StringIndexOutOfBoundsException during the second parse. However,
|
||||
* this is not seen.
|
||||
*/
|
||||
public void Test4104522() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat();
|
||||
String pattern = "'time' hh:mm";
|
||||
sdf.applyPattern(pattern);
|
||||
logln("pattern: \"" + pattern + "\"");
|
||||
// works correctly
|
||||
ParsePosition pp = new ParsePosition(0);
|
||||
String text = "time ";
|
||||
Date dt = sdf.parse(text, pp);
|
||||
logln(" text: \"" + text + "\"" + " date: " + dt);
|
||||
// works wrong
|
||||
pp.setIndex(0);
|
||||
text = "time";
|
||||
dt = sdf.parse(text, pp);
|
||||
logln(" text: \"" + text + "\"" + " date: " + dt);
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4106807
|
||||
*/
|
||||
public void Test4106807() {
|
||||
Date dt;
|
||||
DateFormat df = DateFormat.getDateTimeInstance();
|
||||
|
||||
SimpleDateFormat sdfs[] = {
|
||||
new SimpleDateFormat("yyyyMMddHHmmss"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss'Z'"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss''"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss'a''a'"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss %")};
|
||||
String strings[] = {
|
||||
"19980211140000",
|
||||
"19980211140000",
|
||||
"19980211140000",
|
||||
"19980211140000a",
|
||||
"19980211140000 "};
|
||||
GregorianCalendar gc = new GregorianCalendar();
|
||||
TimeZone timeZone = TimeZone.getDefault();
|
||||
TimeZone gmt = (TimeZone) timeZone.clone();
|
||||
gmt.setRawOffset(0);
|
||||
for (int i = 0; i < 5; i++) {
|
||||
SimpleDateFormat format = sdfs[i];
|
||||
String dateString = strings[i];
|
||||
try {
|
||||
format.setTimeZone(gmt);
|
||||
dt = format.parse(dateString);
|
||||
// {sfb} some of these parses will fail purposely
|
||||
|
||||
StringBuffer fmtd = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
fmtd = df.format(dt, fmtd, pos);
|
||||
logln(fmtd.toString());
|
||||
//logln(df.format(dt));
|
||||
gc.setTime(dt);
|
||||
logln("" + gc.get(Calendar.ZONE_OFFSET));
|
||||
StringBuffer s = new StringBuffer("");
|
||||
s = format.format(dt, s, pos);
|
||||
logln(s.toString());
|
||||
} catch (ParseException e) {
|
||||
logln("No way Jose");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Synopsis: Chinese time zone CTT is not recogonized correctly.
|
||||
Description: Platform Chinese Windows 95 - ** Time zone set to CST **
|
||||
*/
|
||||
/**
|
||||
* @bug 4108407
|
||||
*/
|
||||
|
||||
// {sfb} what to do with this one ??
|
||||
public void Test4108407() {
|
||||
/*
|
||||
long l = System.currentTimeMillis();
|
||||
logln("user.timezone = " + System.getProperty("user.timezone", "?"));
|
||||
logln("Time Zone :" +
|
||||
DateFormat.getDateInstance().getTimeZone().getID());
|
||||
logln("Default format :" +
|
||||
DateFormat.getDateInstance().format(new Date(l)));
|
||||
logln("Full format :" +
|
||||
DateFormat.getDateInstance(DateFormat.FULL).format(new
|
||||
Date(l)));
|
||||
logln("*** Set host TZ to CST ***");
|
||||
logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4134203
|
||||
* SimpleDateFormat won't parse "GMT"
|
||||
*/
|
||||
public void Test4134203() {
|
||||
String dateFormat = "MM/dd/yy HH:mm:ss zzz";
|
||||
SimpleDateFormat fmt = new SimpleDateFormat(dateFormat);
|
||||
|
||||
ParsePosition p0 = new ParsePosition(0);
|
||||
Date d = fmt.parse("01/22/92 04:52:00 GMT", p0);
|
||||
logln(d.toString());
|
||||
if(p0.equals(new ParsePosition(0)))
|
||||
errln("Fail: failed to parse 'GMT'");
|
||||
// In the failure case an exception is thrown by parse();
|
||||
// if no exception is thrown, the test passes.
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4151631
|
||||
* SimpleDateFormat incorrect handling of 2 single quotes in format()
|
||||
*/
|
||||
public void Test4151631() {
|
||||
String pattern =
|
||||
"'TO_DATE('''dd'-'MM'-'yyyy HH:mm:ss''' , ''DD-MM-YYYY HH:MI:SS'')'";
|
||||
logln("pattern=" + pattern);
|
||||
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
|
||||
StringBuffer result = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.clear();
|
||||
cal.set(1998, Calendar.JUNE, 30, 13, 30, 0);
|
||||
Date d = cal.getTime();
|
||||
result = format.format(d, result, pos);
|
||||
if (!result.toString().equals("TO_DATE('30-06-1998 13:30:00' , 'DD-MM-YYYY HH:MI:SS')")) {
|
||||
errln("Fail: result=" + result);
|
||||
} else {
|
||||
logln("Pass: result=" + result);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4151706
|
||||
* 'z' at end of date format throws index exception in SimpleDateFormat
|
||||
* CANNOT REPRODUCE THIS BUG ON 1.2FCS
|
||||
*/
|
||||
public void Test4151706() {
|
||||
String dateString = "Thursday, 31-Dec-98 23:00:00 GMT";
|
||||
SimpleDateFormat fmt = new SimpleDateFormat("EEEE, dd-MMM-yy HH:mm:ss z", Locale.US);
|
||||
Date d = new Date();
|
||||
try {
|
||||
d = fmt.parse(dateString);
|
||||
// {sfb} what about next two lines?
|
||||
if (d.getTime() != Date.UTC(1998 - 1900, Calendar.DECEMBER, 31, 23, 0, 0))
|
||||
errln("Incorrect value: " + d);
|
||||
} catch (Exception e) {
|
||||
errln("Fail: " + e);
|
||||
}
|
||||
StringBuffer temp = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
logln(dateString + " . " + fmt.format(d, temp, pos));
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4162071
|
||||
* Cannot reproduce this bug under 1.2 FCS -- it may be a convoluted duplicate
|
||||
* of some other bug that has been fixed.
|
||||
*/
|
||||
public void Test4162071() {
|
||||
String dateString = "Thu, 30-Jul-1999 11:51:14 GMT";
|
||||
String format = "EEE', 'dd-MMM-yyyy HH:mm:ss z"; // RFC 822/1123
|
||||
SimpleDateFormat df = new SimpleDateFormat(format, Locale.US);
|
||||
try {
|
||||
Date x = df.parse(dateString);
|
||||
StringBuffer temp = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
logln(dateString + " -> " + df.format(x, temp, pos));
|
||||
} catch (Exception e) {
|
||||
errln("Parse format \"" + format + "\" failed.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DateFormat shouldn't parse year "-1" as a two-digit year (e.g., "-1" . 1999).
|
||||
*/
|
||||
public void Test4182066() {
|
||||
SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yy", Locale.US);
|
||||
SimpleDateFormat dispFmt = new SimpleDateFormat("MMM dd yyyy HH:mm:ss GG", Locale.US);
|
||||
TimeZone defaultTZ = TimeZone.getDefault();
|
||||
/* We expect 2-digit year formats to put 2-digit years in the right
|
||||
* window. Out of range years, that is, anything less than "00" or
|
||||
* greater than "99", are treated as literal years. So "1/2/3456"
|
||||
* becomes 3456 AD. Likewise, "1/2/-3" becomes -3 AD == 2 BC.
|
||||
*/
|
||||
final String STRINGS[] =
|
||||
{"02/29/00", "01/23/01", "04/05/-1", "01/23/-9", "11/12/1314", "10/31/1", "09/12/+1", "09/12/001",};
|
||||
int STRINGS_COUNT = STRINGS.length;
|
||||
|
||||
Calendar cal = Calendar.getInstance();
|
||||
Date FAIL_DATE = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(2000, Calendar.FEBRUARY, 29);
|
||||
Date d0 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(2001, Calendar.JANUARY, 23);
|
||||
Date d1 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(-1, Calendar.APRIL, 5);
|
||||
Date d2 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(-9, Calendar.JANUARY, 23);
|
||||
Date d3 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(1314, Calendar.NOVEMBER, 12);
|
||||
Date d4 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(1, Calendar.OCTOBER, 31);
|
||||
Date d5 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(1, Calendar.SEPTEMBER, 12);
|
||||
Date d7 = cal.getTime();
|
||||
Date DATES[] = {d0, d1, d2, d3, d4, d5, FAIL_DATE, d7};
|
||||
|
||||
String out = "";
|
||||
boolean pass = true;
|
||||
for (int i = 0; i < STRINGS_COUNT; ++i) {
|
||||
String str = STRINGS[i];
|
||||
Date expected = DATES[i];
|
||||
Date actual = null;
|
||||
try {
|
||||
actual = fmt.parse(str);
|
||||
} catch (ParseException e) {
|
||||
actual = FAIL_DATE;
|
||||
}
|
||||
String actStr = "";
|
||||
if ((actual.getTime()) == FAIL_DATE.getTime()) {
|
||||
actStr += "null";
|
||||
} else {
|
||||
// Yuck: See j25
|
||||
actStr = ((DateFormat) dispFmt).format(actual);
|
||||
}
|
||||
|
||||
if (expected.getTime() == (actual.getTime())) {
|
||||
out += str + " => " + actStr + "\n";
|
||||
} else {
|
||||
String expStr = "";
|
||||
if (expected.getTime() == FAIL_DATE.getTime()) {
|
||||
expStr += "null";
|
||||
} else {
|
||||
// Yuck: See j25
|
||||
expStr = ((DateFormat) dispFmt).format(expected);
|
||||
}
|
||||
out += "FAIL: " + str + " => " + actStr + ", expected " + expStr + "\n";
|
||||
pass = false;
|
||||
}
|
||||
}
|
||||
if (pass) {
|
||||
log(out);
|
||||
} else {
|
||||
err(out);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* j32 {JDK Bug 4210209 4209272}
|
||||
* DateFormat cannot parse Feb 29 2000 when setLenient(false)
|
||||
*/
|
||||
public void Test4210209() {
|
||||
|
||||
String pattern = "MMM d, yyyy";
|
||||
SimpleDateFormat sfmt = new SimpleDateFormat(pattern, Locale.US);
|
||||
SimpleDateFormat sdisp = new SimpleDateFormat("MMM dd yyyy GG", Locale.US);
|
||||
DateFormat fmt = (DateFormat) sfmt; // Yuck: See j25
|
||||
DateFormat disp = (DateFormat) sdisp; // Yuck: See j25
|
||||
|
||||
Calendar calx = (Calendar) fmt.getCalendar(); // cast away const!
|
||||
calx.setLenient(false);
|
||||
Date d = new Date(); //(2000-1900, Calendar.FEBRUARY, 29);
|
||||
String s = fmt.format(d);
|
||||
logln(disp.format(d) + " f> " + pattern + " => \"" + s + "\"");
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
d = fmt.parse(s, pos);
|
||||
logln("\"" + s + "\" p> " + pattern + " => " + disp.format(d));
|
||||
logln("Parse pos = " + pos.getIndex() + ", error pos = " + pos.getErrorIndex());
|
||||
if (pos.getErrorIndex() != -1) {
|
||||
errln("FAIL: Error index should be -1");
|
||||
}
|
||||
|
||||
// The underlying bug is in GregorianCalendar. If the following lines
|
||||
// succeed, the bug is fixed. If the bug isn't fixed, they will throw
|
||||
// an exception.
|
||||
GregorianCalendar cal = new GregorianCalendar();
|
||||
cal.clear();
|
||||
cal.setLenient(false);
|
||||
cal.set(2000, Calendar.FEBRUARY, 29); // This should work!
|
||||
logln("Attempt to set Calendar to Feb 29 2000: " + disp.format(cal.getTime()));
|
||||
}
|
||||
|
||||
public void Test714() {
|
||||
//TimeZone Offset
|
||||
TimeZone defaultTZ = TimeZone.getDefault();
|
||||
TimeZone PST = TimeZone.getTimeZone("PST");
|
||||
int defaultOffset = defaultTZ.getRawOffset();
|
||||
int PSTOffset = PST.getRawOffset();
|
||||
Date d = new Date(978103543000l - (defaultOffset - PSTOffset));
|
||||
d = new Date(d.getTime() - (defaultTZ.inDaylightTime(d) ? 3600000 : 0));
|
||||
DateFormat fmt = DateFormat.getDateTimeInstance(-1, DateFormat.MEDIUM, Locale.US);
|
||||
String tests = "7:25:43 AM";
|
||||
String s = fmt.format(d);
|
||||
if (!s.equals(tests)) {
|
||||
errln("Fail: " + s + " != " + tests);
|
||||
} else {
|
||||
logln("OK: " + s + " == " + tests);
|
||||
}
|
||||
}
|
||||
}
|
849
icu4j/src/com/ibm/icu/test/format/DateFormatRegressionTest.java
Executable file
849
icu4j/src/com/ibm/icu/test/format/DateFormatRegressionTest.java
Executable file
@ -0,0 +1,849 @@
|
||||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2001, International Business Machines Corporation and *
|
||||
* others. All Rights Reserved. *
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Port From: ICU4C v1.8.1 : format : DateFormatRegressionTest
|
||||
* Source File: $ICU4CRoot/source/test/intltest/dtfmrgts.cpp
|
||||
**/
|
||||
|
||||
package com.ibm.icu.test.format;
|
||||
|
||||
import com.ibm.text.*;
|
||||
import com.ibm.util.*;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
import java.text.FieldPosition;
|
||||
import java.text.ParseException;
|
||||
import java.text.ParsePosition;
|
||||
import java.text.Format;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* Performs regression test for DateFormat
|
||||
**/
|
||||
public class DateFormatRegressionTest extends com.ibm.test.TestFmwk {
|
||||
|
||||
public static void main(String[] args) throws Exception{
|
||||
new DateFormatRegressionTest().run(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4029195
|
||||
*/
|
||||
public void Test4029195() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
Date today = cal.getTime();
|
||||
logln("today: " + today);
|
||||
SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance();
|
||||
String pat = sdf.toPattern();
|
||||
logln("pattern: " + pat);
|
||||
StringBuffer fmtd = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
fmtd = sdf.format(today, fmtd, pos);
|
||||
logln("today: " + fmtd);
|
||||
|
||||
sdf.applyPattern("G yyyy DDD");
|
||||
StringBuffer todayS = new StringBuffer("");
|
||||
todayS = sdf.format(today, todayS, pos);
|
||||
logln("today: " + todayS);
|
||||
try {
|
||||
today = sdf.parse(todayS.toString());
|
||||
logln("today date: " + today);
|
||||
} catch (Exception e) {
|
||||
errln("Error reparsing date: " + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
StringBuffer rt = new StringBuffer("");
|
||||
rt = sdf.format(sdf.parse(todayS.toString()), rt, pos);
|
||||
logln("round trip: " + rt);
|
||||
if (!rt.toString().equals(todayS.toString()))
|
||||
errln("Fail: Want " + todayS + " Got " + rt);
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4052408
|
||||
*/
|
||||
public void Test4052408() {
|
||||
|
||||
DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US);
|
||||
Date dt = new Date(97, Calendar.MAY, 3, 8, 55);
|
||||
String str = fmt.format(dt);
|
||||
logln(str);
|
||||
|
||||
if (!str.equals("5/3/97 8:55 AM"))
|
||||
errln("Fail: Test broken; Want 5/3/97 8:55 AM Got " + str);
|
||||
|
||||
String expected[] = {
|
||||
"", //"ERA_FIELD",
|
||||
"97", //"YEAR_FIELD",
|
||||
"5", //"MONTH_FIELD",
|
||||
"3", //"DATE_FIELD",
|
||||
"", //"HOUR_OF_DAY1_FIELD",
|
||||
"", //"HOUR_OF_DAY0_FIELD",
|
||||
"55", //"MINUTE_FIELD",
|
||||
"", //"SECOND_FIELD",
|
||||
"", //"MILLISECOND_FIELD",
|
||||
"", //"DAY_OF_WEEK_FIELD",
|
||||
"", //"DAY_OF_YEAR_FIELD",
|
||||
"", //"DAY_OF_WEEK_IN_MONTH_FIELD",
|
||||
"", //"WEEK_OF_YEAR_FIELD",
|
||||
"", //"WEEK_OF_MONTH_FIELD",
|
||||
"AM", //"AM_PM_FIELD",
|
||||
"8", //"HOUR1_FIELD",
|
||||
"", //"HOUR0_FIELD",
|
||||
"" //"TIMEZONE_FIELD"
|
||||
};
|
||||
String fieldNames[] = {
|
||||
"ERA_FIELD",
|
||||
"YEAR_FIELD",
|
||||
"MONTH_FIELD",
|
||||
"DATE_FIELD",
|
||||
"HOUR_OF_DAY1_FIELD",
|
||||
"HOUR_OF_DAY0_FIELD",
|
||||
"MINUTE_FIELD",
|
||||
"SECOND_FIELD",
|
||||
"MILLISECOND_FIELD",
|
||||
"DAY_OF_WEEK_FIELD",
|
||||
"DAY_OF_YEAR_FIELD",
|
||||
"DAY_OF_WEEK_IN_MONTH_FIELD",
|
||||
"WEEK_OF_YEAR_FIELD",
|
||||
"WEEK_OF_MONTH_FIELD",
|
||||
"AM_PM_FIELD",
|
||||
"HOUR1_FIELD",
|
||||
"HOUR0_FIELD",
|
||||
"TIMEZONE_FIELD"};
|
||||
|
||||
boolean pass = true;
|
||||
for (int i = 0; i <= 17; ++i) {
|
||||
FieldPosition pos = new FieldPosition(i);
|
||||
StringBuffer buf = new StringBuffer("");
|
||||
fmt.format(dt, buf, pos);
|
||||
//char[] dst = new char[pos.getEndIndex() - pos.getBeginIndex()];
|
||||
String dst = buf.substring(pos.getBeginIndex(), pos.getEndIndex());
|
||||
str = dst;
|
||||
log(i + ": " + fieldNames[i] + ", \"" + str + "\", "
|
||||
+ pos.getBeginIndex() + ", " + pos.getEndIndex());
|
||||
String exp = expected[i];
|
||||
if ((exp.length() == 0 && str.length() == 0) || str.equals(exp))
|
||||
logln(" ok");
|
||||
else {
|
||||
logln(" expected " + exp);
|
||||
pass = false;
|
||||
}
|
||||
}
|
||||
if (!pass)
|
||||
errln("Fail: FieldPosition not set right by DateFormat");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4056591
|
||||
* Verify the function of the [s|g]et2DigitYearStart() API.
|
||||
*/
|
||||
public void Test4056591() {
|
||||
|
||||
try {
|
||||
SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd", Locale.US);
|
||||
Date start = new Date(1809-1900, Calendar.DECEMBER, 25);
|
||||
fmt.set2DigitYearStart(start);
|
||||
if ((fmt.get2DigitYearStart() != start))
|
||||
errln("get2DigitYearStart broken");
|
||||
Date dates[] = {
|
||||
new Date(1809 - 1900, Calendar.DECEMBER, 25),
|
||||
new Date(1909 - 1900, Calendar.DECEMBER, 24),
|
||||
new Date(1809 - 1900, Calendar.DECEMBER, 26),
|
||||
new Date(1861 - 1900, Calendar.DECEMBER, 25), };
|
||||
|
||||
String strings[] = {"091225", "091224", "091226", "611225"};
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
String s = strings[i];
|
||||
Date exp = dates[i];
|
||||
Date got = fmt.parse(s);
|
||||
logln(s + " . " + got + "; exp " + exp);
|
||||
if (got.getTime() != exp.getTime())
|
||||
errln("set2DigitYearStart broken");
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4059917
|
||||
*/
|
||||
public void Test4059917() {
|
||||
SimpleDateFormat fmt;
|
||||
String myDate;
|
||||
fmt = new SimpleDateFormat("yyyy/MM/dd");
|
||||
myDate = "1997/01/01";
|
||||
aux917( fmt, myDate );
|
||||
fmt = new SimpleDateFormat("yyyyMMdd");
|
||||
myDate = "19970101";
|
||||
aux917( fmt, myDate );
|
||||
}
|
||||
|
||||
public void aux917(SimpleDateFormat fmt, String str) {
|
||||
|
||||
String pat = fmt.toPattern();
|
||||
logln("==================");
|
||||
logln("testIt: pattern=" + pat + " string=" + str);
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
Object o = fmt.parseObject(str, pos);
|
||||
//logln( UnicodeString("Parsed object: ") + o );
|
||||
|
||||
StringBuffer formatted = new StringBuffer("");
|
||||
FieldPosition poss = new FieldPosition(0);
|
||||
formatted = fmt.format(o, formatted, poss);
|
||||
|
||||
logln("Formatted string: " + formatted);
|
||||
if (!formatted.toString().equals(str))
|
||||
errln("Fail: Want " + str + " Got " + formatted);
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4060212
|
||||
*/
|
||||
public void Test4060212() {
|
||||
String dateString = "1995-040.05:01:29";
|
||||
logln("dateString= " + dateString);
|
||||
logln("Using yyyy-DDD.hh:mm:ss");
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-DDD.hh:mm:ss");
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
Date myDate = formatter.parse(dateString, pos);
|
||||
DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.LONG);
|
||||
String myString = fmt.format(myDate);
|
||||
logln(myString);
|
||||
Calendar cal = new GregorianCalendar();
|
||||
cal.setTime(myDate);
|
||||
if ((cal.get(Calendar.DAY_OF_YEAR) != 40))
|
||||
errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40");
|
||||
|
||||
logln("Using yyyy-ddd.hh:mm:ss");
|
||||
formatter = new SimpleDateFormat("yyyy-ddd.hh:mm:ss");
|
||||
pos.setIndex(0);
|
||||
myDate = formatter.parse(dateString, pos);
|
||||
myString = fmt.format(myDate);
|
||||
logln(myString);
|
||||
cal.setTime(myDate);
|
||||
if ((cal.get(Calendar.DAY_OF_YEAR) != 40))
|
||||
errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40");
|
||||
}
|
||||
/**
|
||||
* @bug 4061287
|
||||
*/
|
||||
public void Test4061287() {
|
||||
|
||||
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
|
||||
try {
|
||||
logln(df.parse("35/01/1971").toString());
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
df.setLenient(false);
|
||||
boolean ok = false;
|
||||
try {
|
||||
logln(df.parse("35/01/1971").toString());
|
||||
} catch (ParseException e) {
|
||||
ok = true;
|
||||
}
|
||||
if (!ok)
|
||||
errln("Fail: Lenient not working");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4065240
|
||||
*/
|
||||
public void Test4065240() {
|
||||
Date curDate;
|
||||
DateFormat shortdate, fulldate;
|
||||
String strShortDate, strFullDate;
|
||||
Locale saveLocale = Locale.getDefault();
|
||||
TimeZone saveZone = TimeZone.getDefault();
|
||||
|
||||
try {
|
||||
Locale curLocale = new Locale("de", "DE");
|
||||
Locale.setDefault(curLocale);
|
||||
// {sfb} adoptDefault instead of setDefault
|
||||
//TimeZone.setDefault(TimeZone.createTimeZone("EST"));
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("EST"));
|
||||
curDate = new Date(98, 0, 1);
|
||||
shortdate = DateFormat.getDateInstance(DateFormat.SHORT);
|
||||
fulldate = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
|
||||
strShortDate = "The current date (short form) is ";
|
||||
String temp;
|
||||
temp = shortdate.format(curDate);
|
||||
strShortDate += temp;
|
||||
strFullDate = "The current date (long form) is ";
|
||||
String temp2 = fulldate.format(curDate);
|
||||
strFullDate += temp2;
|
||||
|
||||
logln(strShortDate);
|
||||
logln(strFullDate);
|
||||
|
||||
// {sfb} What to do with resource bundle stuff?????
|
||||
|
||||
// Check to see if the resource is present; if not, we can't test
|
||||
ResourceBundle bundle =
|
||||
ResourceBundle.getBundle("java.text.resources.DateFormatZoneData", curLocale);
|
||||
|
||||
// {sfb} API change to ResourceBundle -- add getLocale()
|
||||
/*if (bundle.getLocale().getLanguage().equals("de")) {
|
||||
// UPDATE THIS AS ZONE NAME RESOURCE FOR <EST> in de_DE is updated
|
||||
if (!strFullDate.endsWith("GMT-05:00"))
|
||||
errln("Fail: Want GMT-05:00");
|
||||
} else {
|
||||
logln("*** TEST COULD NOT BE COMPLETED BECAUSE DateFormatZoneData ***");
|
||||
logln("*** FOR LOCALE de OR de_DE IS MISSING ***");
|
||||
}*/
|
||||
} catch (Exception e) {
|
||||
|
||||
} finally {
|
||||
Locale.setDefault(saveLocale);
|
||||
TimeZone.setDefault(saveZone);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
DateFormat.equals is too narrowly defined. As a result, MessageFormat
|
||||
does not work correctly. DateFormat.equals needs to be written so
|
||||
that the Calendar sub-object is not compared using Calendar.equals,
|
||||
but rather compared for equivalency. This may necessitate adding a
|
||||
(package private) method to Calendar to test for equivalency.
|
||||
|
||||
Currently this bug breaks MessageFormat.toPattern
|
||||
*/
|
||||
/**
|
||||
* @bug 4071441
|
||||
*/
|
||||
public void Test4071441() {
|
||||
DateFormat fmtA = DateFormat.getInstance();
|
||||
DateFormat fmtB = DateFormat.getInstance();
|
||||
|
||||
// {sfb} Is it OK to cast away const here?
|
||||
Calendar calA = fmtA.getCalendar();
|
||||
Calendar calB = fmtB.getCalendar();
|
||||
Date epoch = new Date(0, 0, 0);
|
||||
Date xmas = new Date(61, Calendar.DECEMBER, 25);
|
||||
|
||||
calA.setTime(epoch);
|
||||
calB.setTime(epoch);
|
||||
|
||||
if (!calA.equals(calB))
|
||||
errln("Fail: Can't complete test; Calendar instances unequal");
|
||||
if (!fmtA.equals(fmtB))
|
||||
errln("Fail: DateFormat unequal when Calendars equal");
|
||||
calB.setTime(xmas);
|
||||
if (calA.equals(calB))
|
||||
errln("Fail: Can't complete test; Calendar instances equal");
|
||||
if (!fmtA.equals(fmtB))
|
||||
errln("Fail: DateFormat unequal when Calendars equivalent");
|
||||
logln("DateFormat.equals ok");
|
||||
}
|
||||
|
||||
/* The java.text.DateFormat.parse(String) method expects for the
|
||||
US locale a string formatted according to mm/dd/yy and parses it
|
||||
correctly.
|
||||
|
||||
When given a string mm/dd/yyyy it only parses up to the first
|
||||
two y's, typically resulting in a date in the year 1919.
|
||||
|
||||
Please extend the parsing method(s) to handle strings with
|
||||
four-digit year values (probably also applicable to various
|
||||
other locales. */
|
||||
/**
|
||||
* @bug 4073003
|
||||
*/
|
||||
public void Test4073003() {
|
||||
try {
|
||||
DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
|
||||
String tests[] = {"12/25/61", "12/25/1961", "4/3/2010", "4/3/10"};
|
||||
for (int i = 0; i < 4; i += 2) {
|
||||
Date d = fmt.parse(tests[i]);
|
||||
Date dd = fmt.parse(tests[i + 1]);
|
||||
String s;
|
||||
s = fmt.format(d);
|
||||
String ss;
|
||||
ss = fmt.format(dd);
|
||||
if (d.getTime() != dd.getTime())
|
||||
errln("Fail: " + d + " != " + dd);
|
||||
if (!s.equals(ss))
|
||||
errln("Fail: " + s + " != " + ss);
|
||||
logln("Ok: " + s + " " + d);
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
errln("Fail: " + e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4089106
|
||||
*/
|
||||
public void Test4089106() {
|
||||
TimeZone def = TimeZone.getDefault();
|
||||
try {
|
||||
TimeZone z = new SimpleTimeZone((int) (1.25 * 3600000), "FAKEZONE");
|
||||
TimeZone.setDefault(z);
|
||||
SimpleDateFormat f = new SimpleDateFormat();
|
||||
if (!f.getTimeZone().equals(z))
|
||||
errln("Fail: SimpleTimeZone should use TimeZone.getDefault()");
|
||||
} finally {
|
||||
TimeZone.setDefault(def);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4100302
|
||||
*/
|
||||
public void Test4100302() {
|
||||
|
||||
Locale locales[] = {
|
||||
Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA,
|
||||
Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH,
|
||||
Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY,
|
||||
Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN,
|
||||
Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN,
|
||||
Locale.TRADITIONAL_CHINESE, Locale.UK, Locale.US};
|
||||
try {
|
||||
boolean pass = true;
|
||||
for (int i = 0; i < 21; i++) {
|
||||
Format format = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locales[i]);
|
||||
byte[] bytes;
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
oos.writeObject(format);
|
||||
oos.flush();
|
||||
baos.close();
|
||||
bytes = baos.toByteArray();
|
||||
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
|
||||
Object o = ois.readObject();
|
||||
if (!format.equals(o)) {
|
||||
pass = false;
|
||||
logln("DateFormat instance for locale " + locales[i] + " is incorrectly serialized/deserialized.");
|
||||
} else {
|
||||
logln("DateFormat instance for locale " + locales[i] + " is OKAY.");
|
||||
}
|
||||
}
|
||||
if (!pass)
|
||||
errln("Fail: DateFormat serialization/equality bug");
|
||||
} catch (OptionalDataException e) {
|
||||
errln("Fail: " + e);
|
||||
} catch (IOException e) {
|
||||
errln("Fail: " + e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
errln("Fail: " + e);
|
||||
} catch (Exception e) {
|
||||
errln("Fail: " + e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4101483
|
||||
*/
|
||||
public void Test4101483() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("z", Locale.US);
|
||||
FieldPosition fp = new FieldPosition(DateFormat.TIMEZONE_FIELD);
|
||||
Date d = new Date(9234567890L);
|
||||
StringBuffer buf = new StringBuffer("");
|
||||
sdf.format(d, buf, fp);
|
||||
logln(sdf.format(d, buf, fp).toString());
|
||||
logln("beginIndex = " + fp.getBeginIndex());
|
||||
logln("endIndex = " + fp.getEndIndex());
|
||||
if (fp.getBeginIndex() == fp.getEndIndex())
|
||||
errln("Fail: Empty field");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4103340
|
||||
* @bug 4138203
|
||||
* This bug really only works in Locale.US, since that's what the locale
|
||||
* used for Date.toString() is. Bug 4138203 reports that it fails on Korean
|
||||
* NT; it would actually have failed on any non-US locale. Now it should
|
||||
* work on all locales.
|
||||
*/
|
||||
public void Test4103340() {
|
||||
|
||||
// choose a date that is the FIRST of some month
|
||||
// and some arbitrary time
|
||||
Date d = new Date(97, 3, 1, 1, 1, 1);
|
||||
SimpleDateFormat df = new SimpleDateFormat("MMMM", Locale.US);
|
||||
String s = d.toString();
|
||||
StringBuffer s2 = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
s2 = df.format(d, s2, pos);
|
||||
logln("Date=" + s);
|
||||
logln("DF=" + s2);
|
||||
String substr = s2.substring(0,2);
|
||||
if (s.indexOf(substr) == -1)
|
||||
errln("Months should match");
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4103341
|
||||
*/
|
||||
public void Test4103341() {
|
||||
TimeZone saveZone = TimeZone.getDefault();
|
||||
try {
|
||||
// {sfb} changed from adoptDefault to setDefault
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("CST"));
|
||||
SimpleDateFormat simple = new SimpleDateFormat("MM/dd/yyyy HH:mm");
|
||||
TimeZone temp = TimeZone.getDefault();
|
||||
if (!simple.getTimeZone().equals(temp))
|
||||
errln("Fail: SimpleDateFormat not using default zone");
|
||||
} finally {
|
||||
TimeZone.setDefault(saveZone);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4104136
|
||||
*/
|
||||
public void Test4104136() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat();
|
||||
String pattern = "'time' hh:mm";
|
||||
sdf.applyPattern(pattern);
|
||||
logln("pattern: \"" + pattern + "\"");
|
||||
String strings[] = {"time 10:30", "time 10:x", "time 10x"};
|
||||
ParsePosition ppos[] = {new ParsePosition(10), new ParsePosition(0), new ParsePosition(0)};
|
||||
Date dates[] = {new Date(70, Calendar.JANUARY, 1, 10, 30), new Date(-1), new Date(-1)};
|
||||
for (int i = 0; i < 3; i++) {
|
||||
String text = strings[i];
|
||||
ParsePosition finish = ppos[i];
|
||||
Date exp = dates[i];
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
Date d = sdf.parse(text, pos);
|
||||
logln(" text: \"" + text + "\"");
|
||||
logln(" index: %d" + pos.getIndex());
|
||||
logln(" result: " + d);
|
||||
if (pos.getIndex() != finish.getIndex())
|
||||
errln("Fail: Expected pos " + finish.getIndex());
|
||||
if (!((d == null && exp.equals(new Date(-1))) || (d.equals(exp))))
|
||||
errln( "Fail: Expected result " + exp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4104522
|
||||
* CANNOT REPRODUCE
|
||||
* According to the bug report, this test should throw a
|
||||
* StringIndexOutOfBoundsException during the second parse. However,
|
||||
* this is not seen.
|
||||
*/
|
||||
public void Test4104522() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat();
|
||||
String pattern = "'time' hh:mm";
|
||||
sdf.applyPattern(pattern);
|
||||
logln("pattern: \"" + pattern + "\"");
|
||||
// works correctly
|
||||
ParsePosition pp = new ParsePosition(0);
|
||||
String text = "time ";
|
||||
Date dt = sdf.parse(text, pp);
|
||||
logln(" text: \"" + text + "\"" + " date: " + dt);
|
||||
// works wrong
|
||||
pp.setIndex(0);
|
||||
text = "time";
|
||||
dt = sdf.parse(text, pp);
|
||||
logln(" text: \"" + text + "\"" + " date: " + dt);
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4106807
|
||||
*/
|
||||
public void Test4106807() {
|
||||
Date dt;
|
||||
DateFormat df = DateFormat.getDateTimeInstance();
|
||||
|
||||
SimpleDateFormat sdfs[] = {
|
||||
new SimpleDateFormat("yyyyMMddHHmmss"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss'Z'"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss''"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss'a''a'"),
|
||||
new SimpleDateFormat("yyyyMMddHHmmss %")};
|
||||
String strings[] = {
|
||||
"19980211140000",
|
||||
"19980211140000",
|
||||
"19980211140000",
|
||||
"19980211140000a",
|
||||
"19980211140000 "};
|
||||
GregorianCalendar gc = new GregorianCalendar();
|
||||
TimeZone timeZone = TimeZone.getDefault();
|
||||
TimeZone gmt = (TimeZone) timeZone.clone();
|
||||
gmt.setRawOffset(0);
|
||||
for (int i = 0; i < 5; i++) {
|
||||
SimpleDateFormat format = sdfs[i];
|
||||
String dateString = strings[i];
|
||||
try {
|
||||
format.setTimeZone(gmt);
|
||||
dt = format.parse(dateString);
|
||||
// {sfb} some of these parses will fail purposely
|
||||
|
||||
StringBuffer fmtd = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
fmtd = df.format(dt, fmtd, pos);
|
||||
logln(fmtd.toString());
|
||||
//logln(df.format(dt));
|
||||
gc.setTime(dt);
|
||||
logln("" + gc.get(Calendar.ZONE_OFFSET));
|
||||
StringBuffer s = new StringBuffer("");
|
||||
s = format.format(dt, s, pos);
|
||||
logln(s.toString());
|
||||
} catch (ParseException e) {
|
||||
logln("No way Jose");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Synopsis: Chinese time zone CTT is not recogonized correctly.
|
||||
Description: Platform Chinese Windows 95 - ** Time zone set to CST **
|
||||
*/
|
||||
/**
|
||||
* @bug 4108407
|
||||
*/
|
||||
|
||||
// {sfb} what to do with this one ??
|
||||
public void Test4108407() {
|
||||
/*
|
||||
long l = System.currentTimeMillis();
|
||||
logln("user.timezone = " + System.getProperty("user.timezone", "?"));
|
||||
logln("Time Zone :" +
|
||||
DateFormat.getDateInstance().getTimeZone().getID());
|
||||
logln("Default format :" +
|
||||
DateFormat.getDateInstance().format(new Date(l)));
|
||||
logln("Full format :" +
|
||||
DateFormat.getDateInstance(DateFormat.FULL).format(new
|
||||
Date(l)));
|
||||
logln("*** Set host TZ to CST ***");
|
||||
logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4134203
|
||||
* SimpleDateFormat won't parse "GMT"
|
||||
*/
|
||||
public void Test4134203() {
|
||||
String dateFormat = "MM/dd/yy HH:mm:ss zzz";
|
||||
SimpleDateFormat fmt = new SimpleDateFormat(dateFormat);
|
||||
|
||||
ParsePosition p0 = new ParsePosition(0);
|
||||
Date d = fmt.parse("01/22/92 04:52:00 GMT", p0);
|
||||
logln(d.toString());
|
||||
if(p0.equals(new ParsePosition(0)))
|
||||
errln("Fail: failed to parse 'GMT'");
|
||||
// In the failure case an exception is thrown by parse();
|
||||
// if no exception is thrown, the test passes.
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4151631
|
||||
* SimpleDateFormat incorrect handling of 2 single quotes in format()
|
||||
*/
|
||||
public void Test4151631() {
|
||||
String pattern =
|
||||
"'TO_DATE('''dd'-'MM'-'yyyy HH:mm:ss''' , ''DD-MM-YYYY HH:MI:SS'')'";
|
||||
logln("pattern=" + pattern);
|
||||
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
|
||||
StringBuffer result = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.clear();
|
||||
cal.set(1998, Calendar.JUNE, 30, 13, 30, 0);
|
||||
Date d = cal.getTime();
|
||||
result = format.format(d, result, pos);
|
||||
if (!result.toString().equals("TO_DATE('30-06-1998 13:30:00' , 'DD-MM-YYYY HH:MI:SS')")) {
|
||||
errln("Fail: result=" + result);
|
||||
} else {
|
||||
logln("Pass: result=" + result);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4151706
|
||||
* 'z' at end of date format throws index exception in SimpleDateFormat
|
||||
* CANNOT REPRODUCE THIS BUG ON 1.2FCS
|
||||
*/
|
||||
public void Test4151706() {
|
||||
String dateString = "Thursday, 31-Dec-98 23:00:00 GMT";
|
||||
SimpleDateFormat fmt = new SimpleDateFormat("EEEE, dd-MMM-yy HH:mm:ss z", Locale.US);
|
||||
Date d = new Date();
|
||||
try {
|
||||
d = fmt.parse(dateString);
|
||||
// {sfb} what about next two lines?
|
||||
if (d.getTime() != Date.UTC(1998 - 1900, Calendar.DECEMBER, 31, 23, 0, 0))
|
||||
errln("Incorrect value: " + d);
|
||||
} catch (Exception e) {
|
||||
errln("Fail: " + e);
|
||||
}
|
||||
StringBuffer temp = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
logln(dateString + " . " + fmt.format(d, temp, pos));
|
||||
}
|
||||
|
||||
/**
|
||||
* @bug 4162071
|
||||
* Cannot reproduce this bug under 1.2 FCS -- it may be a convoluted duplicate
|
||||
* of some other bug that has been fixed.
|
||||
*/
|
||||
public void Test4162071() {
|
||||
String dateString = "Thu, 30-Jul-1999 11:51:14 GMT";
|
||||
String format = "EEE', 'dd-MMM-yyyy HH:mm:ss z"; // RFC 822/1123
|
||||
SimpleDateFormat df = new SimpleDateFormat(format, Locale.US);
|
||||
try {
|
||||
Date x = df.parse(dateString);
|
||||
StringBuffer temp = new StringBuffer("");
|
||||
FieldPosition pos = new FieldPosition(0);
|
||||
logln(dateString + " -> " + df.format(x, temp, pos));
|
||||
} catch (Exception e) {
|
||||
errln("Parse format \"" + format + "\" failed.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DateFormat shouldn't parse year "-1" as a two-digit year (e.g., "-1" . 1999).
|
||||
*/
|
||||
public void Test4182066() {
|
||||
SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yy", Locale.US);
|
||||
SimpleDateFormat dispFmt = new SimpleDateFormat("MMM dd yyyy HH:mm:ss GG", Locale.US);
|
||||
TimeZone defaultTZ = TimeZone.getDefault();
|
||||
/* We expect 2-digit year formats to put 2-digit years in the right
|
||||
* window. Out of range years, that is, anything less than "00" or
|
||||
* greater than "99", are treated as literal years. So "1/2/3456"
|
||||
* becomes 3456 AD. Likewise, "1/2/-3" becomes -3 AD == 2 BC.
|
||||
*/
|
||||
final String STRINGS[] =
|
||||
{"02/29/00", "01/23/01", "04/05/-1", "01/23/-9", "11/12/1314", "10/31/1", "09/12/+1", "09/12/001",};
|
||||
int STRINGS_COUNT = STRINGS.length;
|
||||
|
||||
Calendar cal = Calendar.getInstance();
|
||||
Date FAIL_DATE = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(2000, Calendar.FEBRUARY, 29);
|
||||
Date d0 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(2001, Calendar.JANUARY, 23);
|
||||
Date d1 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(-1, Calendar.APRIL, 5);
|
||||
Date d2 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(-9, Calendar.JANUARY, 23);
|
||||
Date d3 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(1314, Calendar.NOVEMBER, 12);
|
||||
Date d4 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(1, Calendar.OCTOBER, 31);
|
||||
Date d5 = cal.getTime();
|
||||
cal.clear();
|
||||
cal.set(1, Calendar.SEPTEMBER, 12);
|
||||
Date d7 = cal.getTime();
|
||||
Date DATES[] = {d0, d1, d2, d3, d4, d5, FAIL_DATE, d7};
|
||||
|
||||
String out = "";
|
||||
boolean pass = true;
|
||||
for (int i = 0; i < STRINGS_COUNT; ++i) {
|
||||
String str = STRINGS[i];
|
||||
Date expected = DATES[i];
|
||||
Date actual = null;
|
||||
try {
|
||||
actual = fmt.parse(str);
|
||||
} catch (ParseException e) {
|
||||
actual = FAIL_DATE;
|
||||
}
|
||||
String actStr = "";
|
||||
if ((actual.getTime()) == FAIL_DATE.getTime()) {
|
||||
actStr += "null";
|
||||
} else {
|
||||
// Yuck: See j25
|
||||
actStr = ((DateFormat) dispFmt).format(actual);
|
||||
}
|
||||
|
||||
if (expected.getTime() == (actual.getTime())) {
|
||||
out += str + " => " + actStr + "\n";
|
||||
} else {
|
||||
String expStr = "";
|
||||
if (expected.getTime() == FAIL_DATE.getTime()) {
|
||||
expStr += "null";
|
||||
} else {
|
||||
// Yuck: See j25
|
||||
expStr = ((DateFormat) dispFmt).format(expected);
|
||||
}
|
||||
out += "FAIL: " + str + " => " + actStr + ", expected " + expStr + "\n";
|
||||
pass = false;
|
||||
}
|
||||
}
|
||||
if (pass) {
|
||||
log(out);
|
||||
} else {
|
||||
err(out);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* j32 {JDK Bug 4210209 4209272}
|
||||
* DateFormat cannot parse Feb 29 2000 when setLenient(false)
|
||||
*/
|
||||
public void Test4210209() {
|
||||
|
||||
String pattern = "MMM d, yyyy";
|
||||
SimpleDateFormat sfmt = new SimpleDateFormat(pattern, Locale.US);
|
||||
SimpleDateFormat sdisp = new SimpleDateFormat("MMM dd yyyy GG", Locale.US);
|
||||
DateFormat fmt = (DateFormat) sfmt; // Yuck: See j25
|
||||
DateFormat disp = (DateFormat) sdisp; // Yuck: See j25
|
||||
|
||||
Calendar calx = (Calendar) fmt.getCalendar(); // cast away const!
|
||||
calx.setLenient(false);
|
||||
Date d = new Date(); //(2000-1900, Calendar.FEBRUARY, 29);
|
||||
String s = fmt.format(d);
|
||||
logln(disp.format(d) + " f> " + pattern + " => \"" + s + "\"");
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
d = fmt.parse(s, pos);
|
||||
logln("\"" + s + "\" p> " + pattern + " => " + disp.format(d));
|
||||
logln("Parse pos = " + pos.getIndex() + ", error pos = " + pos.getErrorIndex());
|
||||
if (pos.getErrorIndex() != -1) {
|
||||
errln("FAIL: Error index should be -1");
|
||||
}
|
||||
|
||||
// The underlying bug is in GregorianCalendar. If the following lines
|
||||
// succeed, the bug is fixed. If the bug isn't fixed, they will throw
|
||||
// an exception.
|
||||
GregorianCalendar cal = new GregorianCalendar();
|
||||
cal.clear();
|
||||
cal.setLenient(false);
|
||||
cal.set(2000, Calendar.FEBRUARY, 29); // This should work!
|
||||
logln("Attempt to set Calendar to Feb 29 2000: " + disp.format(cal.getTime()));
|
||||
}
|
||||
|
||||
public void Test714() {
|
||||
//TimeZone Offset
|
||||
TimeZone defaultTZ = TimeZone.getDefault();
|
||||
TimeZone PST = TimeZone.getTimeZone("PST");
|
||||
int defaultOffset = defaultTZ.getRawOffset();
|
||||
int PSTOffset = PST.getRawOffset();
|
||||
Date d = new Date(978103543000l - (defaultOffset - PSTOffset));
|
||||
d = new Date(d.getTime() - (defaultTZ.inDaylightTime(d) ? 3600000 : 0));
|
||||
DateFormat fmt = DateFormat.getDateTimeInstance(-1, DateFormat.MEDIUM, Locale.US);
|
||||
String tests = "7:25:43 AM";
|
||||
String s = fmt.format(d);
|
||||
if (!s.equals(tests)) {
|
||||
errln("Fail: " + s + " != " + tests);
|
||||
} else {
|
||||
logln("OK: " + s + " == " + tests);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user