12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 5f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * Copyright (C) 2001-2015, International Business Machines Corporation and * 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From: ICU4C v1.8.1 : format : DateFormatRegressionTest 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Source File: $ICU4CRoot/source/test/intltest/dtfmrgts.cpp 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayInputStream; 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayOutputStream; 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException; 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectInputStream; 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectOutputStream; 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.OptionalDataException; 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition; 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.Format; 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date; 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test; 312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat; 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SimpleDateFormat; 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Calendar; 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.GregorianCalendar; 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.IslamicCalendar; 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.JapaneseCalendar; 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.SimpleTimeZone; 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeZone; 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Performs regression test for DateFormat 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class DateFormatRegressionTest extends com.ibm.icu.dev.test.TestFmwk { 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4029195 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4029195() { 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date today = cal.getTime(); 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("today: " + today); 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance(); 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = sdf.toPattern(); 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("pattern: " + pat); 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer fmtd = new StringBuffer(""); 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmtd = sdf.format(today, fmtd, pos); 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("today: " + fmtd); 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdf.applyPattern("G yyyy DDD"); 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer todayS = new StringBuffer(""); 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert todayS = sdf.format(today, todayS, pos); 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("today: " + todayS); 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert today = sdf.parse(todayS.toString()); 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("today date: " + today); 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Error reparsing date: " + e.getMessage()); 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer rt = new StringBuffer(""); 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rt = sdf.format(sdf.parse(todayS.toString()), rt, pos); 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("round trip: " + rt); 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!rt.toString().equals(todayS.toString())) 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Want " + todayS + " Got " + rt); 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4052408 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4052408() { 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US); 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(97 + 1900, Calendar.MAY, 3, 8, 55); 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date dt = cal.getTime(); 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = fmt.format(dt); 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(str); 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!str.equals("5/3/97, 8:55 AM")) 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Test broken; Want 5/3/97, 8:55 AM Got " + str); 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expected[] = { 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"ERA_FIELD", 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "97", //"YEAR_FIELD", 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "5", //"MONTH_FIELD", 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "3", //"DATE_FIELD", 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"HOUR_OF_DAY1_FIELD", 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"HOUR_OF_DAY0_FIELD", 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "55", //"MINUTE_FIELD", 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"SECOND_FIELD", 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"MILLISECOND_FIELD", 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"DAY_OF_WEEK_FIELD", 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"DAY_OF_YEAR_FIELD", 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"DAY_OF_WEEK_IN_MONTH_FIELD", 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"WEEK_OF_YEAR_FIELD", 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"WEEK_OF_MONTH_FIELD", 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "AM", //"AM_PM_FIELD", 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "8", //"HOUR1_FIELD", 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "", //"HOUR0_FIELD", 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "" //"TIMEZONE_FIELD" 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String fieldNames[] = { 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "ERA_FIELD", 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "YEAR_FIELD", 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "MONTH_FIELD", 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "DATE_FIELD", 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "HOUR_OF_DAY1_FIELD", 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "HOUR_OF_DAY0_FIELD", 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "MINUTE_FIELD", 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "SECOND_FIELD", 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "MILLISECOND_FIELD", 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "DAY_OF_WEEK_FIELD", 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "DAY_OF_YEAR_FIELD", 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "DAY_OF_WEEK_IN_MONTH_FIELD", 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "WEEK_OF_YEAR_FIELD", 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "WEEK_OF_MONTH_FIELD", 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "AM_PM_FIELD", 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "HOUR1_FIELD", 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "HOUR0_FIELD", 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "TIMEZONE_FIELD"}; 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean pass = true; 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i <= 17; ++i) { 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(i); 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buf = new StringBuffer(""); 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(dt, buf, pos); 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //char[] dst = new char[pos.getEndIndex() - pos.getBeginIndex()]; 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String dst = buf.substring(pos.getBeginIndex(), pos.getEndIndex()); 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = dst; 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert log(i + ": " + fieldNames[i] + ", \"" + str + "\", " 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + pos.getBeginIndex() + ", " + pos.getEndIndex()); 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String exp = expected[i]; 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((exp.length() == 0 && str.length() == 0) || str.equals(exp)) 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" ok"); 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert else { 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" expected " + exp); 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pass = false; 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!pass) 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: FieldPosition not set right by DateFormat"); 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4056591 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Verify the function of the [s|g]et2DigitYearStart() API. 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4056591() { 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd", Locale.US); 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1809, Calendar.DECEMBER, 25); 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date start = cal.getTime(); 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.set2DigitYearStart(start); 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((fmt.get2DigitYearStart() != start)) 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("get2DigitYearStart broken"); 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1809, Calendar.DECEMBER, 25); 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d1 = cal.getTime(); 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1909, Calendar.DECEMBER, 24); 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d2 = cal.getTime(); 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1809, Calendar.DECEMBER, 26); 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d3 = cal.getTime(); 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1861, Calendar.DECEMBER, 25); 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d4 = cal.getTime(); 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date dates[] = {d1, d2, d3, d4}; 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strings[] = {"091225", "091224", "091226", "611225"}; 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 4; i++) { 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = strings[i]; 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date exp = dates[i]; 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date got = fmt.parse(s); 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(s + " . " + got + "; exp " + exp); 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (got.getTime() != exp.getTime()) 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("set2DigitYearStart broken"); 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4059917 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4059917() { 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat fmt; 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String myDate; 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new SimpleDateFormat("yyyy/MM/dd"); 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert myDate = "1997/01/01"; 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert aux917( fmt, myDate ); 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new SimpleDateFormat("yyyyMMdd"); 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert myDate = "19970101"; 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert aux917( fmt, myDate ); 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void aux917(SimpleDateFormat fmt, String str) { 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = fmt.toPattern(); 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("=================="); 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("testIt: pattern=" + pat + " string=" + str); 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object o = fmt.parseObject(str, pos); 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //logln( UnicodeString("Parsed object: ") + o ); 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer formatted = new StringBuffer(""); 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition poss = new FieldPosition(0); 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert formatted = fmt.format(o, formatted, poss); 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Formatted string: " + formatted); 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!formatted.toString().equals(str)) 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Want " + str + " Got " + formatted); 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4060212 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4060212() { 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String dateString = "1995-040.05:01:29"; 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("dateString= " + dateString); 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Using yyyy-DDD.hh:mm:ss"); 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat formatter = new SimpleDateFormat("yyyy-DDD.hh:mm:ss"); 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date myDate = formatter.parse(dateString, pos); 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.LONG); 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String myString = fmt.format(myDate); 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(myString); 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = new GregorianCalendar(); 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setTime(myDate); 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((cal.get(Calendar.DAY_OF_YEAR) != 40)) 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40"); 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Using yyyy-ddd.hh:mm:ss"); 2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert formatter = new SimpleDateFormat("yyyy-ddd.hh:mm:ss"); 2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pos.setIndex(0); 2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert myDate = formatter.parse(dateString, pos); 2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert myString = fmt.format(myDate); 2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(myString); 2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setTime(myDate); 2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((cal.get(Calendar.DAY_OF_YEAR) != 40)) 2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40"); 2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4061287 2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4061287() { 2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(df.parse("35/01/1971").toString()); 2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setLenient(false); 2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean ok = false; 2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(df.parse("35/01/1971").toString()); 2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ok = true; 2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!ok) 2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Lenient not working"); 2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4065240 2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4065240() { 3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date curDate; 3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat shortdate, fulldate; 3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strShortDate, strFullDate; 3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale saveLocale = Locale.getDefault(); 3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone saveZone = TimeZone.getDefault(); 3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale curLocale = new Locale("de", "DE"); 3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.setDefault(curLocale); 3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} adoptDefault instead of setDefault 3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //TimeZone.setDefault(TimeZone.createTimeZone("EST")); 3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone.setDefault(TimeZone.getTimeZone("EST")); 3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(98 + 1900, 0, 1); 3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert curDate = cal.getTime(); 3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert shortdate = DateFormat.getDateInstance(DateFormat.SHORT); 3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fulldate = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); 3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert strShortDate = "The current date (short form) is "; 3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String temp; 3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert temp = shortdate.format(curDate); 3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert strShortDate += temp; 3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert strFullDate = "The current date (long form) is "; 3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String temp2 = fulldate.format(curDate); 3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert strFullDate += temp2; 3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(strShortDate); 3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(strFullDate); 3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} What to do with resource bundle stuff????? 3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Check to see if the resource is present; if not, we can't test 3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //ResourceBundle bundle = //The variable is never used 3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ICULocaleData.getBundle("DateFormatZoneData", curLocale); 3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} API change to ResourceBundle -- add getLocale() 3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*if (bundle.getLocale().getLanguage().equals("de")) { 3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // UPDATE THIS AS ZONE NAME RESOURCE FOR <EST> in de_DE is updated 3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!strFullDate.endsWith("GMT-05:00")) 3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Want GMT-05:00"); 3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("*** TEST COULD NOT BE COMPLETED BECAUSE DateFormatZoneData ***"); 3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("*** FOR LOCALE de OR de_DE IS MISSING ***"); 3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }*/ 3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(e.getMessage()); 3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } finally { 3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.setDefault(saveLocale); 3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone.setDefault(saveZone); 3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat.equals is too narrowly defined. As a result, MessageFormat 3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert does not work correctly. DateFormat.equals needs to be written so 3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert that the Calendar sub-object is not compared using Calendar.equals, 3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert but rather compared for equivalency. This may necessitate adding a 3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (package private) method to Calendar to test for equivalency. 3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currently this bug breaks MessageFormat.toPattern 3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4071441 3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4071441() { 3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmtA = DateFormat.getInstance(); 3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmtB = DateFormat.getInstance(); 3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} Is it OK to cast away const here? 3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar calA = fmtA.getCalendar(); 3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar calB = fmtB.getCalendar(); 3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calA.clear(); 3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calA.set(1900, 0 ,0); 3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calB.clear(); 3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calB.set(1900, 0, 0); 3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!calA.equals(calB)) 3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Can't complete test; Calendar instances unequal"); 3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!fmtA.equals(fmtB)) 3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: DateFormat unequal when Calendars equal"); 3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calB.clear(); 3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calB.set(1961, Calendar.DECEMBER, 25); 3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (calA.equals(calB)) 3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Can't complete test; Calendar instances equal"); 3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!fmtA.equals(fmtB)) 3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: DateFormat unequal when Calendars equivalent"); 3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("DateFormat.equals ok"); 3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* The java.text.DateFormat.parse(String) method expects for the 3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert US locale a string formatted according to mm/dd/yy and parses it 3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert correctly. 3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert When given a string mm/dd/yyyy it only parses up to the first 3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert two y's, typically resulting in a date in the year 1919. 3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Please extend the parsing method(s) to handle strings with 4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert four-digit year values (probably also applicable to various 4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert other locales. */ 4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4073003 4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4073003() { 4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US); 4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String tests[] = {"12/25/61", "12/25/1961", "4/3/2010", "4/3/10"}; 4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 4; i += 2) { 4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = fmt.parse(tests[i]); 4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date dd = fmt.parse(tests[i + 1]); 4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s; 4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = fmt.format(d); 4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String ss; 4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ss = fmt.format(dd); 4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (d.getTime() != dd.getTime()) 4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + d + " != " + dd); 4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(ss)) 4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + s + " != " + ss); 4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: " + s + " " + d); 4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4089106 4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4089106() { 4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone def = TimeZone.getDefault(); 4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone z = new SimpleTimeZone((int) (1.25 * 3600000), "FAKEZONE"); 4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone.setDefault(z); 438fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller // Android patch (http://b/28949992) start. 439fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller // ICU TimeZone.setDefault() not supported on Android. 440fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller z = TimeZone.getDefault(); 441fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller // Android patch (http://b/28949992) end. 4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat f = new SimpleDateFormat(); 4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!f.getTimeZone().equals(z)) 4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: SimpleTimeZone should use TimeZone.getDefault()"); 4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } finally { 4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone.setDefault(def); 4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4100302 4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4100302() { 4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale locales[] = { 4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA, 4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH, 4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY, 4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN, 4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN, 4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale.TRADITIONAL_CHINESE, Locale.UK, Locale.US}; 4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean pass = true; 4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 21; i++) { 4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Format format = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locales[i]); 4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert byte[] bytes; 4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ByteArrayOutputStream baos = new ByteArrayOutputStream(); 4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ObjectOutputStream oos = new ObjectOutputStream(baos); 4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert oos.writeObject(format); 4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert oos.flush(); 4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert baos.close(); 4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bytes = baos.toByteArray(); 4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); 4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object o = ois.readObject(); 4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!format.equals(o)) { 4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pass = false; 4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("DateFormat instance for locale " + locales[i] + " is incorrectly serialized/deserialized."); 4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("DateFormat instance for locale " + locales[i] + " is OKAY."); 4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!pass) 4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: DateFormat serialization/equality bug"); 4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (OptionalDataException e) { 4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IOException e) { 4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ClassNotFoundException e) { 4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4101483 4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4101483() { 5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat sdf = new SimpleDateFormat("z", Locale.US); 5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(DateFormat.TIMEZONE_FIELD); 5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = new Date(9234567890L); 5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buf = new StringBuffer(""); 5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdf.format(d, buf, fp); 5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(sdf.format(d, buf, fp).toString()); 5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("beginIndex = " + fp.getBeginIndex()); 5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("endIndex = " + fp.getEndIndex()); 5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fp.getBeginIndex() == fp.getEndIndex()) 5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Empty field"); 5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4103340 5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4138203 5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This bug really only works in Locale.US, since that's what the locale 5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * used for Date.toString() is. Bug 4138203 reports that it fails on Korean 5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * NT; it would actually have failed on any non-US locale. Now it should 5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * work on all locales. 5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4103340() { 5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // choose a date that is the FIRST of some month 5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // and some arbitrary time 5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1997, 3, 1, 1, 1, 1); 5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = cal.getTime(); 5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat df = new SimpleDateFormat("MMMM", Locale.US); 5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = d.toString(); 5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer s2 = new StringBuffer(""); 5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s2 = df.format(d, s2, pos); 5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Date=" + s); 5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("DF=" + s2); 5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String substr = s2.substring(0,2); 5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s.indexOf(substr) == -1) 5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Months should match"); 5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4103341 5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4103341() { 5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone saveZone = TimeZone.getDefault(); 5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} changed from adoptDefault to setDefault 5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone.setDefault(TimeZone.getTimeZone("CST")); 5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat simple = new SimpleDateFormat("MM/dd/yyyy HH:mm"); 5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone temp = TimeZone.getDefault(); 5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!simple.getTimeZone().equals(temp)) 5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: SimpleDateFormat not using default zone"); 5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } finally { 5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone.setDefault(saveZone); 5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4104136 5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4104136() { 5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat sdf = new SimpleDateFormat(); 5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = "'time' hh:mm"; 5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdf.applyPattern(pattern); 5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("pattern: \"" + pattern + "\""); 5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strings[] = {"time 10:30", "time 10:x", "time 10x"}; 5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition ppos[] = {new ParsePosition(10), new ParsePosition(0), new ParsePosition(0)}; 5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1970, Calendar.JANUARY, 1, 10, 30); 5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date dates[] = {cal.getTime(), new Date(-1), new Date(-1)}; 5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 3; i++) { 5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text = strings[i]; 5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition finish = ppos[i]; 5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date exp = dates[i]; 5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = sdf.parse(text, pos); 5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" text: \"" + text + "\""); 5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" index: %d" + pos.getIndex()); 5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" result: " + d); 5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pos.getIndex() != finish.getIndex()) 5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: Expected pos " + finish.getIndex()); 5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!((d == null && exp.equals(new Date(-1))) || (d.equals(exp)))) 5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln( "Fail: Expected result " + exp); 5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4104522 5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * CANNOT REPRODUCE 5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * According to the bug report, this test should throw a 5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * StringIndexOutOfBoundsException during the second parse. However, 5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * this is not seen. 5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4104522() { 5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat sdf = new SimpleDateFormat(); 6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = "'time' hh:mm"; 6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdf.applyPattern(pattern); 6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("pattern: \"" + pattern + "\""); 6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // works correctly 6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pp = new ParsePosition(0); 6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text = "time "; 6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date dt = sdf.parse(text, pp); 6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" text: \"" + text + "\"" + " date: " + dt); 6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // works wrong 6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pp.setIndex(0); 6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert text = "time"; 6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert dt = sdf.parse(text, pp); 6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" text: \"" + text + "\"" + " date: " + dt); 6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4106807 6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 6182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4106807() { 6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date dt; 6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getDateTimeInstance(); 6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat sdfs[] = { 6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SimpleDateFormat("yyyyMMddHHmmss"), 6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SimpleDateFormat("yyyyMMddHHmmss'Z'"), 6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SimpleDateFormat("yyyyMMddHHmmss''"), 6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SimpleDateFormat("yyyyMMddHHmmss'a''a'"), 6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SimpleDateFormat("yyyyMMddHHmmss %")}; 6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strings[] = { 6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "19980211140000", 6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "19980211140000", 6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "19980211140000", 6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "19980211140000a", 6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "19980211140000 "}; 6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert GregorianCalendar gc = new GregorianCalendar(); 6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone timeZone = TimeZone.getDefault(); 6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone gmt = (TimeZone) timeZone.clone(); 6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert gmt.setRawOffset(0); 6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 5; i++) { 6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat format = sdfs[i]; 6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String dateString = strings[i]; 6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.setTimeZone(gmt); 6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert dt = format.parse(dateString); 6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} some of these parses will fail purposely 6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer fmtd = new StringBuffer(""); 6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmtd = df.format(dt, fmtd, pos); 6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(fmtd.toString()); 6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //logln(df.format(dt)); 6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert gc.setTime(dt); 6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("" + gc.get(Calendar.ZONE_OFFSET)); 6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer s = new StringBuffer(""); 6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = format.format(dt, s, pos); 6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(s.toString()); 6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("No way Jose"); 6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Synopsis: Chinese time zone CTT is not recogonized correctly. 6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Description: Platform Chinese Windows 95 - ** Time zone set to CST ** 6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4108407 6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} what to do with this one ?? 6722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4108407() { 6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // TODO user.timezone is a protected system property, catch securityexception and warn 6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // if this is reenabled 6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long l = System.currentTimeMillis(); 6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("user.timezone = " + System.getProperty("user.timezone", "?")); 6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Time Zone :" + 6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat.getDateInstance().getTimeZone().getID()); 6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Default format :" + 6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat.getDateInstance().format(new Date(l))); 6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Full format :" + 6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat.getDateInstance(DateFormat.FULL).format(new 6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date(l))); 6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("*** Set host TZ to CST ***"); 6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***"); 6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4134203 6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * SimpleDateFormat won't parse "GMT" 6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 6952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4134203() { 6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String dateFormat = "MM/dd/yy HH:mm:ss zzz"; 6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat fmt = new SimpleDateFormat(dateFormat); 6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition p0 = new ParsePosition(0); 7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = fmt.parse("01/22/92 04:52:00 GMT", p0); 7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(d.toString()); 7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(p0.equals(new ParsePosition(0))) 7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: failed to parse 'GMT'"); 7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // In the failure case an exception is thrown by parse(); 7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // if no exception is thrown, the test passes. 7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4151631 7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * SimpleDateFormat incorrect handling of 2 single quotes in format() 7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 7132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4151631() { 7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = 7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "'TO_DATE('''dd'-'MM'-'yyyy HH:mm:ss''' , ''DD-MM-YYYY HH:MI:SS'')'"; 7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("pattern=" + pattern); 7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US); 7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer result = new StringBuffer(""); 7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1998, Calendar.JUNE, 30, 13, 30, 0); 7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = cal.getTime(); 7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = format.format(d, result, pos); 7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!result.toString().equals("TO_DATE('30-06-1998 13:30:00' , 'DD-MM-YYYY HH:MI:SS')")) { 7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: result=" + result); 7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pass: result=" + result); 7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4151706 7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 'z' at end of date format throws index exception in SimpleDateFormat 7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * CANNOT REPRODUCE THIS BUG ON 1.2FCS 7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 7382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4151706() { 7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String dateString = "Thursday, 31-Dec-98 23:00:00 GMT"; 7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat fmt = new SimpleDateFormat("EEEE, dd-MMM-yy HH:mm:ss z", Locale.US); 7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.US); 7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1998, Calendar.DECEMBER, 31, 23, 0, 0); 7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = new Date(); 7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert d = fmt.parse(dateString); 7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {sfb} what about next two lines? 7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (d.getTime() != cal.getTime().getTime()) 7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Incorrect value: " + d); 7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + e); 7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer temp = new StringBuffer(""); 7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(dateString + " . " + fmt.format(d, temp, pos)); 7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4162071 7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Cannot reproduce this bug under 1.2 FCS -- it may be a convoluted duplicate 7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * of some other bug that has been fixed. 7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 7642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4162071() { 7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String dateString = "Thu, 30-Jul-1999 11:51:14 GMT"; 7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String format = "EEE', 'dd-MMM-yyyy HH:mm:ss z"; // RFC 822/1123 7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat df = new SimpleDateFormat(format, Locale.US); 7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date x = df.parse(dateString); 7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer temp = new StringBuffer(""); 7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(dateString + " -> " + df.format(x, temp, pos)); 7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Parse format \"" + format + "\" failed."); 7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * DateFormat shouldn't parse year "-1" as a two-digit year (e.g., "-1" . 1999). 7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 7822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4182066() { 7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yy", Locale.US); 7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat dispFmt = new SimpleDateFormat("MMM dd yyyy HH:mm:ss GG", Locale.US); 7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* We expect 2-digit year formats to put 2-digit years in the right 7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * window. Out of range years, that is, anything less than "00" or 7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * greater than "99", are treated as literal years. So "1/2/3456" 7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * becomes 3456 AD. Likewise, "1/2/-3" becomes -3 AD == 2 BC. 7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String STRINGS[] = 7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"02/29/00", "01/23/01", "04/05/-1", "01/23/-9", "11/12/1314", "10/31/1", "09/12/+1", "09/12/001",}; 7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int STRINGS_COUNT = STRINGS.length; 7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(); 7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date FAIL_DATE = cal.getTime(); 7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(2000, Calendar.FEBRUARY, 29); 7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d0 = cal.getTime(); 8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(2001, Calendar.JANUARY, 23); 8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d1 = cal.getTime(); 8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(-1, Calendar.APRIL, 5); 8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d2 = cal.getTime(); 8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(-9, Calendar.JANUARY, 23); 8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d3 = cal.getTime(); 8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1314, Calendar.NOVEMBER, 12); 8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d4 = cal.getTime(); 8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1, Calendar.OCTOBER, 31); 8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d5 = cal.getTime(); 8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(1, Calendar.SEPTEMBER, 12); 8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d7 = cal.getTime(); 8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date DATES[] = {d0, d1, d2, d3, d4, d5, FAIL_DATE, d7}; 8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String out = ""; 8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean pass = true; 8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < STRINGS_COUNT; ++i) { 8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = STRINGS[i]; 8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date expected = DATES[i]; 8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date actual = null; 8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert actual = fmt.parse(str); 8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert actual = FAIL_DATE; 8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String actStr = ""; 8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((actual.getTime()) == FAIL_DATE.getTime()) { 8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert actStr += "null"; 8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Yuck: See j25 8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert actStr = ((DateFormat) dispFmt).format(actual); 8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (expected.getTime() == (actual.getTime())) { 8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert out += str + " => " + actStr + "\n"; 8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expStr = ""; 8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (expected.getTime() == FAIL_DATE.getTime()) { 8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expStr += "null"; 8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Yuck: See j25 8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expStr = ((DateFormat) dispFmt).format(expected); 8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert out += "FAIL: " + str + " => " + actStr + ", expected " + expStr + "\n"; 8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pass = false; 8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pass) { 8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert log(out); 8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert err(out); 8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * j32 {JDK Bug 4210209 4209272} 8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * DateFormat cannot parse Feb 29 2000 when setLenient(false) 8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 8642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test4210209() { 8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = "MMM d, yyyy"; 8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmt = new SimpleDateFormat(pattern, Locale.US); 8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat disp = new SimpleDateFormat("MMM dd yyyy GG", Locale.US); 8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar calx = fmt.getCalendar(); 8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calx.setLenient(false); 8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar calendar = Calendar.getInstance(); 8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calendar.clear(); 8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert calendar.set(2000, Calendar.FEBRUARY, 29); 8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = calendar.getTime(); 8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(d); 8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(disp.format(d) + " f> " + pattern + " => \"" + s + "\""); 8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert d = fmt.parse(s, pos); 8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("\"" + s + "\" p> " + pattern + " => " + 8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (d!=null?disp.format(d):"null")); 8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Parse pos = " + pos.getIndex() + ", error pos = " + pos.getErrorIndex()); 8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pos.getErrorIndex() != -1) { 8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Error index should be -1"); 8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The underlying bug is in GregorianCalendar. If the following lines 8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // succeed, the bug is fixed. If the bug isn't fixed, they will throw 8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // an exception. 8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert GregorianCalendar cal = new GregorianCalendar(); 8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setLenient(false); 8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(2000, Calendar.FEBRUARY, 29); // This should work! 8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert d = cal.getTime(); 8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Attempt to set Calendar to Feb 29 2000: " + disp.format(d)); 8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test714() { 9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //TimeZone Offset 9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone defaultTZ = TimeZone.getDefault(); 9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone PST = TimeZone.getTimeZone("PST"); 9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int defaultOffset = defaultTZ.getRawOffset(); 9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int PSTOffset = PST.getRawOffset(); 9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = new Date(978103543000l - (defaultOffset - PSTOffset)); 9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert d = new Date(d.getTime() - (defaultTZ.inDaylightTime(d) ? 3600000 : 0)); 9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmt = DateFormat.getDateTimeInstance(-1, DateFormat.MEDIUM, Locale.US); 9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String tests = "7:25:43 AM"; 9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(d); 9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(tests)) { 9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: " + s + " != " + tests); 9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: " + s + " == " + tests); 9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test_GEec() { 9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class PatternAndResult { 9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private String pattern; 9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private String result; 9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PatternAndResult(String pat, String res) { 9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pattern = pat; 9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = res; 9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getPattern() { return pattern; } 9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getResult() { return result; } 9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final PatternAndResult[] tests = { 9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "dd MMM yyyy GGG", "02 Jul 2008 AD" ), 9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "dd MMM yyyy GGGGG", "02 Jul 2008 A" ), 9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "e dd MMM yyyy", "4 02 Jul 2008" ), 9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "ee dd MMM yyyy", "04 02 Jul 2008" ), 9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "c dd MMM yyyy", "4 02 Jul 2008" ), 9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "cc dd MMM yyyy", "4 02 Jul 2008" ), 9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "eee dd MMM yyyy", "Wed 02 Jul 2008" ), 9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "EEE dd MMM yyyy", "Wed 02 Jul 2008" ), 9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "EE dd MMM yyyy", "Wed 02 Jul 2008" ), 9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "eeee dd MMM yyyy", "Wednesday 02 Jul 2008" ), 9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "eeeee dd MMM yyyy", "W 02 Jul 2008" ), 9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "e ww YYYY", "4 27 2008" ), 9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new PatternAndResult( "c ww YYYY", "4 27 2008" ), 9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale loc = ULocale.ENGLISH; 9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); 9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = new GregorianCalendar(tz, loc); 9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd", loc); 9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for ( int i = 0; i < tests.length; i++ ) { 9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert PatternAndResult item = tests[i]; 9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert dateFormat.applyPattern( item.getPattern() ); 9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(2008, 6, 2, 5, 0); // 2008 July 02 5 AM PDT 9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buf = new StringBuffer(32); 9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(DateFormat.YEAR_FIELD); 9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert dateFormat.format(cal, buf, fp); 9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( buf.toString().compareTo(item.getResult()) != 0 ) { 9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("for pattern " + item.getPattern() + ", expected " + item.getResult() + ", got " + buf ); 9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert dateFormat.parse( item.getResult(), cal, pos); 9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int year = cal.get(Calendar.YEAR); 9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int month = cal.get(Calendar.MONTH); 9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int day = cal.get(Calendar.DATE); 9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( year != 2008 || month != 6 || day != 2 ) { 9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("use pattern " + item.getPattern() + " to parse " + item.getResult() + 9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected y2008 m6 d2, got " + year + " " + month + " " + day ); 9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final char kArabicZero = 0x0660; 9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final char kHindiZero = 0x0966; 9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final char kLatinZero = 0x0030; 9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestHindiArabicDigits() 9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s; 9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char first; 9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String what; 9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getInstance(new GregorianCalendar(), new ULocale("hi_IN@numbers=deva")); 9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert what = "Gregorian Calendar, hindi"; 9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = df.format(new Date(0)); /* 31/12/1969 */ 9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(what + "=" + s); 9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert first = s.charAt(0); 9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(first<kHindiZero || first>(kHindiZero+9)) { 9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(what + "- wrong digit, got " + s + " (integer digit value " + new Integer((int)first).toString()); 9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getInstance(new IslamicCalendar(), new Locale("ar","IQ")); 9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = df.format(new Date(0)); /* 21/10/1989 */ 9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert what = "Islamic Calendar, Arabic"; 9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(what + ": " + s); 9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert first = s.charAt(0); 9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(first<kArabicZero || first>(kArabicZero+9)) { 10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(what + " wrong digit, got " + s + " (integer digit value " + new Integer((int)first).toString()); 10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getInstance(new GregorianCalendar(), new Locale("ar","IQ")); 10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = df.format(new Date(0)); /* 31/12/1969 */ 10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert what = "Gregorian, ar_IQ, df.getInstance"; 10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(what + ": " + s); 10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert first = s.charAt(0); 10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(first<kArabicZero || first>(kArabicZero+9)) { 10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(what + " wrong digit but got " + s + " (integer digit value " + new Integer((int)first).toString()); 10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getInstance(new GregorianCalendar(), new Locale("mt","MT")); 10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = df.format(new Date(0)); /* 31/12/1969 */ 10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert what = "Gregorian, mt_MT, df.getInstance"; 10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(what + ": " + s); 10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert first = s.charAt(0); 10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(first<kLatinZero || first>(kLatinZero+9)) { 10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(what + " wrong digit but got " + s + " (integer digit value " + new Integer((int)first).toString()); 10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getInstance(new IslamicCalendar(), new Locale("ar","IQ")); 10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = df.format(new Date(0)); /* 31/12/1969 */ 10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert what = "Islamic calendar, ar_IQ, df.getInstance"; 10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(what+ ": " + s); 10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert first = s.charAt(0); 10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(first<kArabicZero || first>(kArabicZero+9)) { 10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(what + " wrong digit but got " + s + " (integer digit value " + new Integer((int)first).toString()); 10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, new Locale("ar","IQ")); 10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = df.format(new Date(0)); /* 31/12/1969 */ 10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert what = "ar_IQ, getDateTimeInstance"; 10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(what+ ": " + s); 10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert first = s.charAt(0); 10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(first<kArabicZero || first>(kArabicZero+9)) { 10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(what + " wrong digit but got " + s + " (integer digit value " + new Integer((int)first).toString()); 10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat df = DateFormat.getInstance(new JapaneseCalendar(), new Locale("ar","IQ")); 10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = df.format(new Date(0)); /* 31/12/1969 */ 10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert what = "ar_IQ, Japanese Calendar, getInstance"; 10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(what+ ": " + s); 10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert first = s.charAt(0); 10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(first<kArabicZero || first>(kArabicZero+9)) { 10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(what + " wrong digit but got " + s + " (integer digit value " + new Integer((int)first).toString()); 10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Ticket#5683 10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Some ICU4J 3.6 data files contain garbage data which prevent the code to resolve another 10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // bundle as an alias. zh_TW should be equivalent to zh_Hant_TW 10622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT5683() { 10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale[] aliasLocales = { 10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("zh", "CN"), 10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("zh", "TW"), 10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("zh", "HK"), 10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("zh", "SG"), 10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("zh", "MO") 10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale[] canonicalLocales = { 10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ULocale("zh_Hans_CN"), 10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ULocale("zh_Hant_TW"), 10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ULocale("zh_Hant_HK"), 10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ULocale("zh_Hans_SG"), 10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ULocale("zh_Hant_MO") 10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = new Date(0); 10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < aliasLocales.length; i++) { 10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat dfAlias = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, aliasLocales[i]); 10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat dfCanonical = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, canonicalLocales[i]); 10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String sAlias = dfAlias.format(d); 10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String sCanonical = dfCanonical.format(d); 10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!sAlias.equals(sCanonical)) { 10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail: The format result for locale " + aliasLocales[i] + " is different from the result for locale " + canonicalLocales[i] 10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ": " + sAlias + "[" + aliasLocales[i] + "] / " + sCanonical + "[" + canonicalLocales[i] + "]"); 10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Note: The purpose of this test case is a little bit questionable. This test 10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // case expects Islamic month name is different from Gregorian month name. 10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // However, some locales (in this code, zh_CN) may intentionally use the same 10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // month name for both Gregorian and Islamic calendars. See #9645. 11002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test5006GetShortMonths() throws Exception { 11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Currently supported NLV locales 11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale ENGLISH = new Locale("en", "US"); // We don't support 'en' alone 11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale ARABIC = new Locale("ar", ""); 11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale CZECH = new Locale("cs", ""); 11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale GERMAN = new Locale("de", ""); 11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale GREEK = new Locale("el", ""); 11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale SPANISH = new Locale("es", ""); 11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale FRENCH = new Locale("fr", ""); 11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale HUNGARIAN = new Locale("hu", ""); 11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale ITALIAN = new Locale("it", ""); 11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale HEBREW = new Locale("iw", ""); 11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale JAPANESE = new Locale("ja", ""); 11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale KOREAN = new Locale("ko", ""); 11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale POLISH = new Locale("pl", ""); 11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale PORTUGUESE = new Locale("pt", "BR"); 11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale RUSSIAN = new Locale("ru", ""); 11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale TURKISH = new Locale("tr", ""); 11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale CHINESE_SIMPLIFIED = new Locale("zh", "CN"); 11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale CHINESE_TRADITIONAL = new Locale("zh", "TW"); 11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale[] locales = new Locale[] { ENGLISH, ARABIC, CZECH, GERMAN, GREEK, SPANISH, FRENCH, 11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert HUNGARIAN, ITALIAN, HEBREW, JAPANESE, KOREAN, POLISH, PORTUGUESE, RUSSIAN, TURKISH, 11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CHINESE_SIMPLIFIED, CHINESE_TRADITIONAL }; 11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] islamicCivilTwelfthMonthLocalized = new String[locales.length]; 11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] islamicTwelfthMonthLocalized = new String[locales.length]; 11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] gregorianTwelfthMonthLocalized = new String[locales.length]; 11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < locales.length; i++) { 11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale locale = locales[i]; 11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Islamic 11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.util.Calendar islamicCivilCalendar = new com.ibm.icu.util.IslamicCalendar(locale); 11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.SimpleDateFormat islamicCivilDateFormat = (com.ibm.icu.text.SimpleDateFormat) islamicCivilCalendar 11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .getDateTimeFormat(com.ibm.icu.text.DateFormat.FULL, -1, locale); 11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.DateFormatSymbols islamicCivilDateFormatSymbols = islamicCivilDateFormat 11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .getDateFormatSymbols(); 11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] shortMonthsCivil = islamicCivilDateFormatSymbols.getShortMonths(); 11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String twelfthMonthLocalizedCivil = shortMonthsCivil[11]; 11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert islamicCivilTwelfthMonthLocalized[i] = twelfthMonthLocalizedCivil; 11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.util.IslamicCalendar islamicCalendar = new com.ibm.icu.util.IslamicCalendar(locale); 11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert islamicCalendar.setCivil(false); 11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.SimpleDateFormat islamicDateFormat = (com.ibm.icu.text.SimpleDateFormat) islamicCalendar 11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .getDateTimeFormat(com.ibm.icu.text.DateFormat.FULL, -1, locale); 11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.DateFormatSymbols islamicDateFormatSymbols = islamicDateFormat 11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .getDateFormatSymbols(); 11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] shortMonths = islamicDateFormatSymbols.getShortMonths(); 11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String twelfthMonthLocalized = shortMonths[11]; 11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert islamicTwelfthMonthLocalized[i] = twelfthMonthLocalized; 11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Gregorian 11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.util.Calendar gregorianCalendar = new com.ibm.icu.util.GregorianCalendar( 11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert locale); 11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.SimpleDateFormat gregorianDateFormat = (com.ibm.icu.text.SimpleDateFormat) gregorianCalendar 11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .getDateTimeFormat(com.ibm.icu.text.DateFormat.FULL, -1, locale); 11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.DateFormatSymbols gregorianDateFormatSymbols = gregorianDateFormat 11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .getDateFormatSymbols(); 11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert shortMonths = gregorianDateFormatSymbols.getShortMonths(); 11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert twelfthMonthLocalized = shortMonths[11]; 11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert gregorianTwelfthMonthLocalized[i] = twelfthMonthLocalized; 11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Compare 11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < locales.length; i++) { 11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String gregorianTwelfthMonth = gregorianTwelfthMonthLocalized[i]; 11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String islamicCivilTwelfthMonth = islamicCivilTwelfthMonthLocalized[i]; 11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String islamicTwelfthMonth = islamicTwelfthMonthLocalized[i]; 11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(locales[i] + ": g:" + gregorianTwelfthMonth + ", ic:" + islamicCivilTwelfthMonth + ", i:"+islamicTwelfthMonth); 11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (gregorianTwelfthMonth.equalsIgnoreCase(islamicTwelfthMonth)) { 11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Simplified Chinese uses numeric month for both Gregorian/Islamic calendars 11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (locales[i] != CHINESE_SIMPLIFIED) { 11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(locales[i] + ": gregorian and islamic are same: " + gregorianTwelfthMonth 11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ", " + islamicTwelfthMonth); 11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (gregorianTwelfthMonth.equalsIgnoreCase(islamicCivilTwelfthMonth)) { 11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Simplified Chinese uses numeric month for both Gregorian/Islamic calendars 11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (locales[i] != CHINESE_SIMPLIFIED) { 11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(locales[i] + ": gregorian and islamic-civil are same: " + gregorianTwelfthMonth 11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ", " + islamicCivilTwelfthMonth); 11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!islamicTwelfthMonth.equalsIgnoreCase(islamicCivilTwelfthMonth)) { 11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(locales[i] + ": islamic-civil and islamic are NOT same: " + islamicCivilTwelfthMonth 11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ", " + islamicTwelfthMonth); 11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParsing() { 12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = "EEE-WW-MMMM-yyyy"; 12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text = "mon-02-march-2011"; 12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int expectedDay = 7; 12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat format = new SimpleDateFormat(pattern); 12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = GregorianCalendar.getInstance(Locale.US); 12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(text, cal, pos); 12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail parsing: " + e); 12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cal.get(Calendar.DAY_OF_MONTH) != expectedDay) { 12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Parsing failed: day of month should be '7' with pattern: \"" + pattern + "\" for text: \"" + text + "\""); 12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Date formatting with Dangi calendar in en locale (#9987) 12252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestDangiFormat() { 12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat fmt = DateFormat.getDateInstance(DateFormat.MEDIUM, new ULocale("en@calendar=dangi")); 12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String calType = fmt.getCalendar().getType(); 12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Incorrect calendar type used by the date format instance", "dangi", calType); 12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert GregorianCalendar gcal = new GregorianCalendar(); 12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert gcal.set(2013, Calendar.MARCH, 1, 0, 0, 0); 12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = gcal.getTime(); 12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String dangiDateStr = fmt.format(d); 1236f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert assertEquals("Bad date format", "Mo1 20, 2013", dangiDateStr); 12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT10110() { 12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat formatter = new SimpleDateFormat("Gy年M月d日E", new Locale("zh_Hans")); 12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Object parsed = */ formatter.parseObject("610000"); 12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch(ParseException pe) { 12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch(Throwable t) { 12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("ParseException not thrown for bad pattern! exception was: " + t.getLocalizedMessage()); 12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("No exception thrown at all for bad pattern!"); 12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT10239() { 12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestDateFormatItem { 12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String parseString; 12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String pattern; 12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String expectedResult; // null indicates expected error 12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Simple constructor 12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public TestDateFormatItem(String parString, String patt, String expResult) { 12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pattern = patt; 12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parseString = parString; 12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectedResult = expResult; 12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final TestDateFormatItem[] items = { 12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // parse String pattern expected result 12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("1 Oct 13 2013", "e MMM dd yyyy", "1 Oct 13 2013"), 12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("02 Oct 14 2013", "ee MMM dd yyyy", "02 Oct 14 2013"), 12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("Tue Oct 15 2013", "eee MMM dd yyyy", "Tue Oct 15 2013"), 12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("Wednesday Oct 16 2013", "eeee MMM dd yyyy", "Wednesday Oct 16 2013"), 12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("Th Oct 17 2013", "eeeeee MMM dd yyyy", "Th Oct 17 2013"), 12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("Fr Oct 18 2013", "EEEEEE MMM dd yyyy", "Fr Oct 18 2013"), 12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("S Oct 19 2013", "eeeee MMM dd yyyy", "S Oct 19 2013"), 12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatItem("S Oct 20 2013", "EEEEE MMM dd yyyy", "S Oct 20 2013"), 12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer result = new StringBuffer(); 12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = new Date(); 12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US); 12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat sdfmt = new SimpleDateFormat(); 12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition p = new ParsePosition(0); 12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (TestDateFormatItem item: items) { 12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdfmt.setCalendar(cal); 12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdfmt.applyPattern(item.pattern); 12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result.setLength(0); 12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert p.setIndex(0); 12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert p.setErrorIndex(-1); 12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert d = sdfmt.parse(item.parseString, p); 12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(item.expectedResult == null) { 12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(p.getErrorIndex() != -1) 12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert else 12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("error: unexpected parse success..."+item.parseString + " should have failed"); 13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(p.getErrorIndex() != -1) { 13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("error: parse error for string " +item.parseString + " against pattern " + item.pattern + " -- idx["+p.getIndex()+"] errIdx["+p.getErrorIndex()+"]"); 13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setTime(d); 13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = sdfmt.format(cal, result, new FieldPosition(0)); 13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(!result.toString().equalsIgnoreCase(item.expectedResult)) { 13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("error: unexpected format result. expected - " + item.expectedResult + " but result was - " + result); 13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("formatted results match! - " + result.toString()); 13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT10334() { 13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = new String("'--: 'EEE-WW-MMMM-yyyy"); 13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text = new String("--mon-02-march-2011"); 13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat format = new SimpleDateFormat(pattern); 13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_PARTIAL_LITERAL_MATCH, false); 13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(text); 13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse partial match did NOT fail in strict mode!"); 13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expected 13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_PARTIAL_LITERAL_MATCH, true); 13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(text); 13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse partial match failure in lenient mode: " + pe.getLocalizedMessage()); 13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pattern = new String("YYYY MM dd"); 13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert text = new String("2013 12 10"); 13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.applyPattern(pattern); 13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date referenceDate = null; 13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert referenceDate = format.parse(text); 13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("unable to instantiate reference date: " + pe.getLocalizedMessage()); 13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(0); 13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pattern = new String("YYYY LL dd ee cc qq QQ"); 13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.applyPattern(pattern); 13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer formattedString = new StringBuffer(); 13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert formattedString = format.format(referenceDate, formattedString, fp); 13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("ref date: " + formattedString); 13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pattern = new String("YYYY LLL dd eee ccc qqq QQQ"); 13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert text = new String("2013 12 10 03 3 04 04"); 13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.applyPattern(pattern); 13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(format.format(referenceDate)); 13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_ALLOW_NUMERIC, true); 13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pp = new ParsePosition(0); 13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(text, pp); 13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int errorIdx = pp.getErrorIndex(); 13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (errorIdx != -1) { 13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("numeric parse error at["+errorIdx+"] on char["+pattern.substring(errorIdx, errorIdx+1)+"] in pattern["+pattern+"]"); 13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_ALLOW_NUMERIC, false); 13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(text); 13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("numeric parse did NOT fail in strict mode!"); 13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expected 13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * test to verify new code (and improve code coverage) for normal quarter processing 13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert text = new String("2013 Dec 10 Thu Thu Q4 Q4"); 13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(text); 13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException pe) { 13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("normal quarter processing failed"); 13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT10619() { 13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestDateFormatLeniencyItem { 13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean leniency; 13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String parseString; 13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String pattern; 13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String expectedResult; // null indicates expected error 13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Simple constructor 13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public TestDateFormatLeniencyItem(boolean len, String parString, String patt, String expResult) { 13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert leniency = len; 14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pattern = patt; 14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parseString = parString; 14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectedResult = expResult; 14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final TestDateFormatLeniencyItem[] items = { 14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // leniency parse String pattern expected result 14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatLeniencyItem(true, "2008-Jan 02", "yyyy-LLL. dd", "2008-Jan. 02"), 14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatLeniencyItem(false, "2008-Jan 03", "yyyy-LLL. dd", null), 14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatLeniencyItem(true, "2008-Jan--04", "yyyy-MMM' -- 'dd", "2008-Jan -- 04"), 14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatLeniencyItem(false, "2008-Jan--05", "yyyy-MMM' -- 'dd", null), 14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatLeniencyItem(true, "2008-12-31", "yyyy-mm-dd", "2008-12-31"), 14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatLeniencyItem(false, "6 Jan 05 2008", "eee MMM dd yyyy", null), 14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestDateFormatLeniencyItem(true, "6 Jan 05 2008", "eee MMM dd yyyy", "Sat Jan 05 2008"), 14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer result = new StringBuffer(); 14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date d = new Date(); 14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US); 14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat sdfmt = new SimpleDateFormat(); 14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition p = new ParsePosition(0); 14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (TestDateFormatLeniencyItem item: items) { 14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdfmt.setCalendar(cal); 14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdfmt.applyPattern(item.pattern); 14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sdfmt.setLenient(item.leniency); 14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result.setLength(0); 14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert p.setIndex(0); 14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert p.setErrorIndex(-1); 14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert d = sdfmt.parse(item.parseString, p); 14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(item.expectedResult == null) { 14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(p.getErrorIndex() != -1) 14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert else 14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("error: unexpected parse success..."+item.parseString + " w/ lenient="+item.leniency+" should have failed"); 14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(p.getErrorIndex() != -1) { 14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("error: parse error for string " +item.parseString + " -- idx["+p.getIndex()+"] errIdx["+p.getErrorIndex()+"]"); 14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setTime(d); 14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = sdfmt.format(cal, result, new FieldPosition(0)); 14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(!result.toString().equalsIgnoreCase(item.expectedResult)) { 14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("error: unexpected format result. expected - " + item.expectedResult + " but result was - " + result); 14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("formatted results match! - " + result.toString()); 14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestT10906() 14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = new String("MM-dd-yyyy"); 14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text = new String("06-10-2014"); 14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert SimpleDateFormat format = new SimpleDateFormat(pattern); 14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pp = new ParsePosition(-1); 14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(text, pp); 14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int errorIdx = pp.getErrorIndex(); 14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (errorIdx == -1) { 14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("failed to report invalid (negative) starting parse position"); 14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch(StringIndexOutOfBoundsException e) { 14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("failed to fix invalid (negative) starting parse position"); 14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1469f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1470f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert // Test case for numeric field format threading problem 14712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 1472f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert public void TestT11363() { 1473f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1474f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert class TestThread extends Thread { 1475f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert SimpleDateFormat fmt; 1476f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert Date d; 1477f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1478f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert TestThread(SimpleDateFormat fmt, Date d) { 1479f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert this.fmt = fmt; 1480f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert this.d = d; 1481f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1482f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1483f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert public void run() { 1484f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert String s0 = fmt.format(d); 1485f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert for (int i = 0; i < 1000; i++) { 1486f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert String s = fmt.format(d); 1487f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert if (!s0.equals(s)) { 1488f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert errln("Result: " + s + ", Expected: " + s0); 1489f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1490f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1491f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1492f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1493f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1494f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert SimpleDateFormat fmt0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 1495f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1496f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert Thread[] threads = new Thread[10]; 1497f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1498f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert GregorianCalendar cal = new GregorianCalendar(2014, Calendar.NOVEMBER, 5, 12, 34, 56); 1499f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.set(Calendar.MILLISECOND, 777); 1500f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1501f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert // calls format() once on the base object to trigger 1502f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert // lazy initialization stuffs. 1503f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert fmt0.format(cal.getTime()); 1504f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1505f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert for (int i = 0; i < threads.length; i++) { 1506f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert // Add 1 to all fields to use different numbers in each thread 1507f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.add(Calendar.YEAR, 1); 1508f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.add(Calendar.MONTH, 1); 1509f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.add(Calendar.DAY_OF_MONTH, 1); 1510f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.add(Calendar.HOUR_OF_DAY, 1); 1511f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.add(Calendar.MINUTE, 1); 1512f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.add(Calendar.SECOND, 1); 1513f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert cal.add(Calendar.MILLISECOND, 1); 1514f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert Date d = cal.getTime(); 1515f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert SimpleDateFormat fmt = (SimpleDateFormat)fmt0.clone(); 1516f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert threads[i] = new TestThread(fmt, d); 1517f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1518f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1519f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert for (Thread t : threads) { 1520f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert t.start(); 1521f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1522f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 1523f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert for (Thread t : threads) { 1524f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert try { 1525f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert t.join(); 1526f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } catch (InterruptedException e) { 1527f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert errln(e.toString()); 1528f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1529f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 1530f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 1532