use custom date parser

A specialized date parser that can only handle ISO-8601 like dates
(2011-12-03T10:15:30.123Z or 2011-12-03T10:15:30+01:00) but does this
roughly 10 times faster than DateTimeFormatter and 5 times
faster than the FastDateParser of commons-lang3.
This commit is contained in:
2018-11-19 19:23:57 +01:00
parent 6f48a25d53
commit 218ea9ed68
5 changed files with 169 additions and 6 deletions

View File

@@ -0,0 +1,86 @@
package org.lucares.pdbui.date;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@Test
public class FastISODateParserTest {
@DataProvider(name = "providerValidDate")
public Object[][] providerValidDate() {
return new Object[][] { //
{ "2018-11-18T14:42:49.123456789Z" }, //
{ "2018-11-18T14:42:49.123456789+12:34" }, //
{ "2018-11-18T14:42:49.12345678Z" }, //
{ "2018-11-18T14:42:49.12345678+12:34" }, //
{ "2018-11-18T14:42:49.1234567Z" }, //
{ "2018-11-18T14:42:49.1234567+12:34" }, //
{ "2018-11-18T14:42:49.123456Z" }, //
{ "2018-11-18T14:42:49.123456+12:34" }, //
{ "2018-11-18T14:42:49.33256Z" }, //
{ "2018-11-18T14:42:49.33256+12:34" }, //
{ "2018-11-18T14:42:49.3325Z" }, //
{ "2018-11-18T14:42:49.3325+12:34" }, //
{ "2018-11-18T14:42:49.332Z" }, //
{ "2018-11-18T14:42:49.332+00:00" }, //
{ "2018-11-18T14:42:49.332+12:34" }, //
{ "2018-11-18T14:42:49.332-01:23" }, //
{ "2018-11-18T14:55:49.44Z" }, //
{ "2018-11-18T14:55:49.55-01:23" }, //
{ "2018-11-18T14:55:49.4Z" }, //
{ "2018-11-18T14:55:49.5-01:23" }, //
{ "2018-11-18T14:55:49.Z" }, //
{ "2018-11-18T14:55:49.-01:23" }, //
{ "2018-11-18T14:55:49Z" }, //
{ "2018-11-18T14:55:49-01:23" },//
};
}
@Test(dataProvider = "providerValidDate")
public void testParseValidDate(final String date) {
final OffsetDateTime actualDate = FastISODateParser.parse(date);
final OffsetDateTime expectedDate = OffsetDateTime.from(DateTimeFormatter.ISO_DATE_TIME.parse(date));
Assert.assertEquals(actualDate, expectedDate);
}
@DataProvider(name = "providerParseInvalidDate")
public Object[][] providerParseInvalidDate() {
return new Object[][] { //
{ "a2018-11-18T14:42:49.332Z" }, //
{ "a018-11-18T14:42:49.332Z" }, //
{ "2a18-11-18T14:42:49.332Z" }, //
{ "20a8-11-18T14:42:49.332Z" }, //
{ "201a-11-18T14:42:49.332Z" }, //
{ "2018-a1-18T14:42:49.332Z" }, //
{ "2018-1a-18T14:42:49.332Z" }, //
{ "2018-11-a8T14:42:49.332Z" }, //
{ "2018-11-1aT14:42:49.332Z" }, //
{ "2018-11-18Ta4:42:49.332Z" }, //
{ "2018-11-18T1a:42:49.332Z" }, //
{ "2018-11-18T14:a2:49.332Z" }, //
{ "2018-11-18T14:4a:49.332Z" }, //
{ "2018-11-18T14:42:a9.332Z" }, //
{ "2018-11-18T14:42:4a.332Z" }, //
{ "2018-11-18T14:42:49.a32Z" }, //
{ "2018-11-18T14:42:49.3a2Z" }, //
{ "2018-11-18T14:42:49.33aZ" }, //
{ "2018-11-18T14:42:49.332a" }, //
{ "2018-11-18T14:42:49.332a00:00" }, //
{ "2018-11-18T14:42:49.332+a0:00" }, //
{ "2018-11-18T14:42:49.332+0a:00" }, //
{ "2018-11-18T14:42:49.332+00:a0" }, //
{ "2018-11-18T14:42:49.332+00:0a" }//
};
}
@Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "providerParseInvalidDate")
public void testParseInvalidDate(final String invalidDate) {
FastISODateParser.parse(invalidDate);
}
}