blob: 54d48035f05fb3f0ab39260f4053f7e0a8e84ab5 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.i18n.client;
import com.google.gwt.junit.client.GWTTestCase;
import java.util.Date;
/**
* Tests parsing functionality in {@link DateTimeFormat} for the English
* language.
*/
@SuppressWarnings("deprecation")
public class DateTimeParse_en_Test extends GWTTestCase {
// TODO: replace the rest of the assertTrue calls to assertEquals
// for better error reporting, where possible.
@Override
public String getModuleName() {
return "com.google.gwt.i18n.I18NTest_en";
}
public void testAbutField() {
Date date = new Date();
assertTrue(parse("hhmm", "1122", 0, date) > 0);
assertEquals(11, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("hhmm", "122", 0, date) > 0);
assertEquals(1, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("hhmmss", "112233", 0, date) > 0);
assertEquals(11, date.getHours());
assertEquals(22, date.getMinutes());
assertEquals(33, date.getSeconds());
assertTrue(parse("hhmmss", "12233", 0, date) > 0);
assertEquals(1, date.getHours());
assertEquals(22, date.getMinutes());
assertEquals(33, date.getSeconds());
assertTrue(parse("yyyyMMdd", "19991202", 0, date) > 0);
assertEquals(1999 - 1900, date.getYear());
assertEquals(12 - 1, date.getMonth());
assertEquals(2, date.getDate());
assertTrue(parse("yyyyMMdd", "9991202", 0, date) > 0);
assertEquals(999 - 1900, date.getYear());
assertEquals(12 - 1, date.getMonth());
assertEquals(2, date.getDate());
assertTrue(parse("yyyyMMdd", "991202", 0, date) > 0);
assertEquals(99 - 1900, date.getYear());
assertEquals(12 - 1, date.getMonth());
assertEquals(2, date.getDate());
assertTrue(parse("yyyyMMdd", "91202", 0, date) > 0);
assertEquals(9 - 1900, date.getYear());
assertEquals(12 - 1, date.getMonth());
assertEquals(2, date.getDate());
}
public void testAmbiguousYear() {
Date date = new Date();
if (date.getMonth() == 0 && date.getDate() == 1 || date.getMonth() == 11
&& date.getDate() >= 31) {
// we are using current time to resolve ambiguous year.
// This test case is not designed to work on new year's eve and new year.
return;
}
Date orgDate = new Date();
orgDate.setYear(orgDate.getYear() + 20);
orgDate.setMonth(0);
orgDate.setDate(1);
String str = format("MM/dd/yy", orgDate);
assertTrue(parse("MM/dd/yy", str, 0, date) > 0);
assertEquals(date.getYear(), orgDate.getYear());
orgDate.setMonth(11);
orgDate.setDate(31);
str = format("MM/dd/yy", orgDate);
assertTrue(parse("MM/dd/yy", str, 0, date) > 0);
assertEquals(date.getYear() + 100, orgDate.getYear());
assertTrue(parse("yy,MM,dd", "2097,07,21", 0, date) > 0);
assertEquals(2097 - 1900, date.getYear());
}
/**
* Parse the pattern MMMMyyyy when the day of the current month is passed the
* last day of the parsed leap month. For example, parse "February2004" (leap
* month) on January 31. The date should be limited to the last day of the
* month.
*/
public void testCurrentDayInvalidInParsedLeapMonth() {
// Parse "February2004" (leap year) on January 31, 2006.
Date date = new Date(2006 - 1900, 0, 31, 12, 0, 0);
DateTimeFormat format = DateTimeFormat.getFormat("MMMMyyyy");
assertEquals(12, format.parse("February2004", 0, date));
assertEquals(2004 - 1900, date.getYear());
assertEquals(1, date.getMonth());
assertEquals(29, date.getDate());
}
/**
* Parse the pattern MMMMyyyy when the day of the current month is passed the
* last day of the parsed month. For example, parse "February2006" on January
* 31. The date should be limited to the last day of the month.
*/
public void testCurrentDayInvalidInParsedMonth() {
// Parse "February2006" on January 31, 2006.
Date date = new Date(2006 - 1900, 0, 31, 12, 0, 0);
DateTimeFormat format = DateTimeFormat.getFormat("MMMMyyyy");
assertEquals(12, format.parse("February2006", 0, date));
assertEquals(2006 - 1900, date.getYear());
assertEquals(1, date.getMonth());
assertEquals(28, date.getDate());
}
/**
* Parse the pattern MMMMyyyy when the day of the current month is passed the
* last day of the parsed month. For example, parse "February2006" on January
* 31. The date should be limited to the last day of the month.
*/
public void testCurrentDayInvalidInParsedMonthStrict() {
// Parse "February2006" on January 31, 2006.
Date date = new Date(2006 - 1900, 0, 31, 12, 0, 0);
DateTimeFormat format = DateTimeFormat.getFormat("MMMMyyyy");
assertEquals(12, format.parseStrict("February2006", 0, date));
assertEquals(2006 - 1900, date.getYear());
assertEquals(1, date.getMonth());
assertEquals(28, date.getDate());
}
/**
* Parse the pattern MMMMyyyy when the day of the current month is within the
* last day of the parsed month. For example, parse "February2006" on January
* 10.
*/
public void testCurrentDayValidInParsedMonth() {
// Set the date to January 31, 2006.
Date date = new Date(2006 - 1900, 0, 10, 12, 0, 0);
DateTimeFormat format = DateTimeFormat.getFormat("MMMMyyyy");
assertEquals(12, format.parse("February2006", 0, date));
assertEquals(2006 - 1900, date.getYear());
assertEquals(1, date.getMonth());
assertEquals(10, date.getDate());
}
public void testDayOfWeek() {
Date date = new Date();
assertTrue(parse("EEE", "Wed", 0, date) > 0);
assertEquals(3, date.getDay());
assertTrue(parse("EEEE", "Thursday", 0, date) > 0);
assertEquals(4, date.getDay());
}
/**
* Issue 4633: Test that an empty integer value throws an
* {@link IllegalArgumentException}, but does not throw an
* {@link IndexOutOfBoundsException}.
*/
public void testEmptyIntegerValue() {
char[] parts = new char[] {'M', 'd', 'y', 'h', 'H', 'm', 's', 'S', 'k'};
for (int i = 0; i < parts.length; i++) {
DateTimeFormat format = DateTimeFormat.getFormat("M/" + parts[i]);
try {
format.parse("1/");
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
// Expected.
}
}
}
public void testEnglishDate() {
Date date = new Date();
assertTrue(parse("yyyy MMM dd hh:mm", "2006 Jul 10 15:44", 0, date) > 0);
assertEquals(2006 - 1900, date.getYear());
assertEquals(7 - 1, date.getMonth());
assertEquals(10, date.getDate());
assertEquals(15, date.getHours());
assertEquals(44, date.getMinutes());
}
/**
* Add as many tests as you like.
*/
public void testFractionalSeconds() {
Date date = new Date();
assertTrue(parse("hh:mm:ss.SSS", "11:12:13.956", 0, date) > 0);
assertEquals(11, date.getHours());
assertEquals(12, date.getMinutes());
assertEquals(13, date.getSeconds());
assertEquals(956, (date.getTime() % 1000));
assertTrue(parse("hh:mm:ss.SSS", "11:12:13.95", 0, date) > 0);
assertEquals(11, date.getHours());
assertEquals(12, date.getMinutes());
assertEquals(13, date.getSeconds());
assertEquals(950, (date.getTime() % 1000));
assertTrue(parse("hh:mm:ss.SSS", "11:12:13.9", 0, date) > 0);
assertEquals(11, date.getHours());
assertEquals(12, date.getMinutes());
assertEquals(13, date.getSeconds());
assertEquals(900, (date.getTime() % 1000));
}
public void testHourParsingFhh() {
Date date = new Date();
assertTrue(parse("hhmm", "0022", 0, date) > 0);
assertTrue(date.getHours() == 00);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmm", "1122", 0, date) > 0);
assertTrue(date.getHours() == 11);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmm", "1222", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmm", "2322", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmm", "2422", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "0022am", 0, date) > 0);
assertTrue(date.getHours() == 00);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "1122am", 0, date) > 0);
assertTrue(date.getHours() == 11);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "1222am", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "2322am", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "2422am", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "0022pm", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "1122pm", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "1222pm", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "2322pm", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("hhmma", "2422pm", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
}
public void testHourParsingFHH() {
Date date = new Date();
assertTrue(parse("HHmm", "0022", 0, date) > 0);
assertEquals(0, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmm", "1122", 0, date) > 0);
assertEquals(11, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmm", "1222", 0, date) > 0);
assertEquals(12, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmm", "2322", 0, date) > 0);
assertEquals(23, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmm", "2422", 0, date) > 0);
assertEquals(0, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "0022am", 0, date) > 0);
assertEquals(0, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "1122am", 0, date) > 0);
assertEquals(11, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "1222am", 0, date) > 0);
assertEquals(12, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "2322am", 0, date) > 0);
assertEquals(23, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "2422am", 0, date) > 0);
assertEquals(0, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "0022pm", 0, date) > 0);
assertEquals(12, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "1122pm", 0, date) > 0);
assertEquals(23, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "1222pm", 0, date) > 0);
assertEquals(12, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "2322pm", 0, date) > 0);
assertEquals(23, date.getHours());
assertEquals(22, date.getMinutes());
assertTrue(parse("HHmma", "2422pm", 0, date) > 0);
assertEquals(0, date.getHours());
assertEquals(22, date.getMinutes());
}
public void testHourParsingFkk() {
Date date = new Date();
assertTrue(parse("kkmm", "0022", 0, date) > 0);
assertTrue(date.getHours() == 00);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmm", "1122", 0, date) > 0);
assertTrue(date.getHours() == 11);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmm", "1222", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmm", "2322", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmm", "2422", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "0022am", 0, date) > 0);
assertTrue(date.getHours() == 00);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "1122am", 0, date) > 0);
assertTrue(date.getHours() == 11);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "1222am", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "2322am", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "2422am", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "0022pm", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "1122pm", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "1222pm", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "2322pm", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("kkmma", "2422pm", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
}
public void testHourParsingFKK() {
Date date = new Date();
assertTrue(parse("KKmm", "0022", 0, date) > 0);
assertTrue(date.getHours() == 00);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmm", "1122", 0, date) > 0);
assertTrue(date.getHours() == 11);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmm", "1222", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmm", "2322", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmm", "2422", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "0022am", 0, date) > 0);
assertTrue(date.getHours() == 00);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "1122am", 0, date) > 0);
assertTrue(date.getHours() == 11);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "1222am", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "2322am", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "2422am", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "0022pm", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "1122pm", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "1222pm", 0, date) > 0);
assertTrue(date.getHours() == 12);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "2322pm", 0, date) > 0);
assertTrue(date.getHours() == 23);
assertTrue(date.getMinutes() == 22);
assertTrue(parse("KKmma", "2422pm", 0, date) > 0);
assertTrue(date.getHours() == 0);
assertTrue(date.getMinutes() == 22);
}
public void testInvalidDayAndMonth() {
DateTimeFormat fmt = DateTimeFormat.getFormat("MM/dd/yyyy");
try {
fmt.parseStrict("00/22/1999");
fail("Should have thrown an exception on failure to parse");
} catch (IllegalArgumentException e) {
// Success
}
try {
fmt.parseStrict("01/00/1999");
fail("Should have thrown an exception on failure to parse");
} catch (IllegalArgumentException e) {
// Success
}
try {
fmt.parseStrict("01/22/1999");
// success
} catch (IllegalArgumentException e) {
fail("Should succeed to parse");
}
}
public void testLeapYear() {
Date date = new Date();
assertTrue(parse("MMdd, yyyy", "0229, 2001", 0, date) > 0);
assertTrue(date.getMonth() == 3 - 1);
assertTrue(date.getDate() == 1);
assertTrue(parse("MMdd, yyyy", "0229, 2000", 0, date) > 0);
assertTrue(date.getMonth() == 2 - 1);
assertTrue(date.getDate() == 29);
}
public void testLenientParsing() {
Date date = new Date();
DateTimeFormat fmt = DateTimeFormat.getFormat("yyyy.MM.dd hh:mm:ss.SSS aa ZZZZ");
// Valid date
String dateStr = "2000.01.01 05:06:07.123 PM +000";
assertTrue(fmt.parse(dateStr, 0, date) > 0);
assertTrue(fmt.parseStrict(dateStr, 0, date) > 0);
// Invalid Month
dateStr = "2000.13.01 05:06:07.123 PM +000";
assertTrue(fmt.parse(dateStr, 0, date) > 0);
assertEquals(0, fmt.parseStrict(dateStr, 0, date));
// Invalid Day
dateStr = "2000.01.32 05:06:07.123 PM +000";
assertTrue(fmt.parse(dateStr, 0, date) > 0);
assertEquals(0, fmt.parseStrict(dateStr, 0, date));
// Invalid Hour
dateStr = "2000.01.01 24:06:07.123 PM +000";
assertTrue(fmt.parse(dateStr, 0, date) > 0);
assertEquals(0, fmt.parseStrict(dateStr, 0, date));
// Invalid Minute
dateStr = "2000.01.01 05:60:07.123 PM +000";
assertTrue(fmt.parse(dateStr, 0, date) > 0);
assertEquals(0, fmt.parseStrict(dateStr, 0, date));
// Invalid Second
dateStr = "2000.01.01 05:06:60.123 PM +000";
assertTrue(fmt.parse(dateStr, 0, date) > 0);
assertEquals(0, fmt.parseStrict(dateStr, 0, date));
// Invalid Millisecond
dateStr = "2000.01.01 05:06:07.9998 PM +000";
assertTrue(fmt.parse(dateStr, 0, date) > 0);
assertEquals(0, fmt.parseStrict(dateStr, 0, date));
// Two Digit Year, but valid date
DateTimeFormat yyFmt = DateTimeFormat.getFormat("yy.MM.dd");
dateStr = "97.01.01";
assertTrue(yyFmt.parse(dateStr, 0, date) > 0);
assertTrue(yyFmt.parseStrict(dateStr, 0, date) > 0);
// Two Digit Year, invalid date
dateStr = "97.01.40";
assertTrue(yyFmt.parse(dateStr, 0, date) > 0);
assertEquals(0, yyFmt.parseStrict(dateStr, 0, date));
// Invalid date, throwing an exception
dateStr = "97.01.40";
try {
yyFmt.parseStrict(dateStr);
fail("Should have thrown an exception on failure to parse");
} catch (IllegalArgumentException e) {
// Success
}
// Ambiguous next century, valid date
Date today = new Date();
Date ambNext = new Date(today.getTime() + 86400000);
ambNext.setYear(today.getYear() + 20);
String sAmbNext = yyFmt.format(ambNext);
assertTrue(yyFmt.parse(sAmbNext, 0, date) > 0);
assertTrue(yyFmt.parseStrict(sAmbNext, 0, date) > 0);
// Ambiguous previous century, valid date
Date ambPrev = new Date(today.getTime() - 86400000);
ambPrev.setYear(today.getYear() + 20);
String sAmbPrev = yyFmt.format(ambPrev);
assertTrue(yyFmt.parse(sAmbPrev, 0, date) > 0);
assertTrue(yyFmt.parseStrict(sAmbPrev, 0, date) > 0);
// Ambiguous Year, invalid date
sAmbNext = sAmbNext.substring(0, 6) + "32";
assertTrue(yyFmt.parse(sAmbPrev, 0, date) > 0);
assertEquals(0, yyFmt.parseStrict(sAmbNext, 0, date));
}
public void testMonth() {
Date date = new Date(1980, 1, 1);
assertTrue(parse("MM", "03", 0, date) > 0);
assertEquals(2, date.getMonth());
assertTrue(parse("MMM", "Feb", 0, date) > 0);
assertEquals(1, date.getMonth());
assertTrue(parse("MMMM", "July", 0, date) > 0);
assertEquals(6, date.getMonth());
}
public void testParseConsumesAllCharacters() {
String toParse = "July 11, 1938";
DateTimeFormat longDateFormat = DateTimeFormat.getLongDateFormat();
Date actualDate = longDateFormat.parse(toParse);
String actualFormat = longDateFormat.format(actualDate);
assertEquals(toParse, actualFormat);
try {
String toParseMangled = toParse + " asdfasdfasdf";
longDateFormat.parse(toParseMangled);
fail("Should have thrown an exception on failure to parse");
} catch (IllegalArgumentException e) {
// Success.
}
}
public void testPartialParsing() {
// Only specify a date
DateTimeFormat fmt = DateTimeFormat.getFormat("MM-dd-yyyy");
Date dateActual = new Date(87, 10, 22);
Date dateOnly = fmt.parse("11-22-1987");
assertEquals(dateOnly.getHours(), 0);
assertEquals(dateOnly.getMinutes(), 0);
assertEquals(dateOnly.getSeconds(), 0);
assertEquals(dateOnly.getTime(), dateActual.getTime());
// Only specify a time, should use current date
fmt = DateTimeFormat.getFormat("hha");
dateOnly = fmt.parse("4PM");
assertEquals(dateOnly.getHours(), 16);
assertEquals(dateOnly.getMinutes(), 0);
assertEquals(dateOnly.getSeconds(), 0);
}
public void testRFC3339() {
Date date = new Date();
{
// Parse a string formatted according to RFC3389.
String rfc3339str = "1985-04-12T23:20:50.52-08:00";
assertTrue(parse("yyyy-MM-dd'T'HH:mm:ss.SSZ", rfc3339str, 0, date) > 0);
// Create the expected time as UTC. The "+8" is due to the tz offset.
long expectedTimeUTC = Date.UTC(1985 - 1900, 3, 12, 23 + 8, 20, 50);
Date expectedDate = new Date(expectedTimeUTC);
assertEquals(expectedDate.getYear(), date.getYear());
assertEquals(expectedDate.getMonth(), date.getMonth());
assertEquals(expectedDate.getDate(), date.getDate());
assertEquals(expectedDate.getHours(), date.getHours());
assertEquals(expectedDate.getMinutes(), date.getMinutes());
assertEquals(expectedDate.getSeconds(), date.getSeconds());
// Make sure our parse captured the extra 520 milliseconds.
assertEquals(520, date.getTime() % 1000);
}
{
// Parse a string formatted according to RFC3389.
String rfc3339str = "1985-04-12T23:20:50.52Z";
if (rfc3339str.endsWith("Z")) {
StringBuffer strbuf = new StringBuffer(rfc3339str);
strbuf.deleteCharAt(rfc3339str.length() - 1);
strbuf.append("+00:00");
rfc3339str = strbuf.toString();
}
assertTrue(parse("yyyy-MM-dd'T'HH:mm:ss.SSZ", rfc3339str, 0, date) > 0);
// Create the expected time as UTC. The "+0" is because it's already GMT.
long expectedTimeUTC = Date.UTC(85, 3, 12, 23 + 0, 20, 50);
Date expectedDate = new Date(expectedTimeUTC);
assertEquals(expectedDate.getYear(), date.getYear());
assertEquals(expectedDate.getMonth(), date.getMonth());
assertEquals(expectedDate.getDate(), date.getDate());
assertEquals(expectedDate.getHours(), date.getHours());
assertEquals(expectedDate.getMinutes(), date.getMinutes());
assertEquals(expectedDate.getSeconds(), date.getSeconds());
// Make sure our parse captured the extra 520 milliseconds.
assertEquals(520, date.getTime() % 1000);
}
}
public void testStandloneDayOfWeek() {
Date date = new Date(1980, 1, 1);
assertTrue(parse("ccc", "Wed", 0, date) > 0);
assertEquals(3, date.getDay());
assertTrue(parse("cccc", "Thursday", 0, date) > 0);
assertEquals(4, date.getDay());
}
public void testStandloneMonth() {
Date date = new Date(1980, 1, 1);
assertTrue(parse("LL", "03", 0, date) > 0);
assertEquals(2, date.getMonth());
assertTrue(parse("LLL", "Feb", 0, date) > 0);
assertEquals(1, date.getMonth());
assertTrue(parse("LLLL", "July", 0, date) > 0);
assertEquals(6, date.getMonth());
}
public void testTimeZone() {
Date date = new Date();
assertTrue(parse("MM/dd/yyyy, hh:mm:ss zzz",
"07/21/2003, 11:22:33 GMT-0700", 0, date) > 0);
int gmtNegative07 = date.getHours();
assertTrue(parse("MM/dd/yyyy, hh:mm:ss zzz",
"07/21/2003, 11:22:33 GMT-0600", 0, date) > 0);
int gmtNegative06 = date.getHours();
assertTrue((gmtNegative07 + 24 - gmtNegative06) % 24 == 1);
assertTrue(parse("MM/dd/yyyy, hh:mm:ss zzz",
"07/21/2003, 11:22:33 GMT-0800", 0, date) > 0);
int gmtNegative08 = date.getHours();
assertTrue((gmtNegative08 + 24 - gmtNegative07) % 24 == 1);
assertTrue(parse("MM/dd/yyyy, HH:mm:ss zzz",
"07/21/2003, 11:22:33 GMT+0800", 0, date) > 0);
int gmtPositive08 = date.getHours();
assertTrue((gmtNegative08 + 24 - gmtPositive08) % 24 == 16);
}
public void testWeekDay() {
Date date = new Date();
assertTrue(parse("EEEE, MM/dd/yyyy", "Wednesday, 08/16/2006", 0, date) > 0);
assertTrue(date.getYear() == 2006 - 1900);
assertTrue(date.getMonth() == 8 - 1);
assertTrue(date.getDate() == 16);
assertTrue(parse("EEEE, MM/dd/yyyy", "Tuesday, 08/16/2006", 0, date) == 0);
assertTrue(parse("EEEE, MM/dd/yyyy", "Thursday, 08/16/2006", 0, date) == 0);
assertTrue(parse("EEEE, MM/dd/yyyy", "Wed, 08/16/2006", 0, date) > 0);
assertTrue(parse("EEEE, MM/dd/yyyy", "Wasdfed, 08/16/2006", 0, date) == 0);
date.setDate(25);
assertTrue(parse("EEEE, MM/yyyy", "Wed, 09/2006", 0, date) > 0);
assertTrue(date.getDate() == 27);
date.setDate(30);
assertTrue(parse("EEEE, MM/yyyy", "Wed, 09/2006", 0, date) > 0);
assertTrue(date.getDate() == 27);
date.setDate(30);
assertTrue(parse("EEEE, MM/yyyy", "Mon, 09/2006", 0, date) > 0);
assertTrue(date.getDate() == 25);
}
public void testYearParsing() {
Date date = new Date();
assertTrue(parse("yyMMdd", "991202", 0, date) > 0);
assertTrue(date.getYear() == (1999 - 1900));
assertTrue(date.getMonth() == 12 - 1);
assertTrue(date.getDate() == 02);
assertTrue(parse("yyyyMMdd", "20051202", 0, date) > 0);
assertTrue(date.getYear() == (2005 - 1900));
assertTrue(date.getMonth() == 12 - 1);
assertTrue(date.getDate() == 02);
}
private String format(String pattern, Date toFormat) {
DateTimeFormat fmt = DateTimeFormat.getFormat(pattern);
return fmt.format(toFormat);
}
private int parse(String pattern, String toParse, int startIndex, Date output) {
DateTimeFormat fmt = DateTimeFormat.getFormat(pattern);
return fmt.parse(toParse, startIndex, output);
}
}