mirror of https://github.com/apache/lucene.git
SOLR-701: be explicit about Locale when parsing/formating milliseconds. Also: refactor usages of TimeZone and Locale so it's clear when UTC and Locale.US are used for various purposes in case someone considers modifying them.
git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@686159 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
dd81e80044
commit
e584e3a060
|
@ -473,11 +473,11 @@ Bug Fixes
|
||||||
|
|
||||||
28. SOLR-509: Moved firstSearcher event notification to the end of the SolrCore constructor (Koji Sekiguchi via gsingers)
|
28. SOLR-509: Moved firstSearcher event notification to the end of the SolrCore constructor (Koji Sekiguchi via gsingers)
|
||||||
|
|
||||||
29. SOLR-470, SOLR-552, and SOLR-544: Multiple fixes to DateField
|
29. SOLR-470, SOLR-552, SOLR-544, SOLR-701: Multiple fixes to DateField
|
||||||
regarding lenient parsing of optional milliseconds, and correct
|
regarding lenient parsing of optional milliseconds, and correct
|
||||||
formating using the canonical representation. LegacyDateField has
|
formating using the canonical representation. LegacyDateField has
|
||||||
been added for people who have come to depend on the existing
|
been added for people who have come to depend on the existing
|
||||||
broken behavior. (hossman)
|
broken behavior. (hossman, Stefan Oestreicher)
|
||||||
|
|
||||||
30. SOLR-539: Fix for non-atomic long counters and a cast fix to avoid divide
|
30. SOLR-539: Fix for non-atomic long counters and a cast fix to avoid divide
|
||||||
by zero. (Sean Timm via Otis Gospodnetic)
|
by zero. (Sean Timm via Otis Gospodnetic)
|
||||||
|
|
|
@ -31,6 +31,7 @@ import java.io.IOException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.text.DecimalFormatSymbols;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
|
@ -103,6 +104,24 @@ import java.text.FieldPosition;
|
||||||
public class DateField extends FieldType {
|
public class DateField extends FieldType {
|
||||||
|
|
||||||
public static TimeZone UTC = TimeZone.getTimeZone("UTC");
|
public static TimeZone UTC = TimeZone.getTimeZone("UTC");
|
||||||
|
|
||||||
|
/* :TODO: let Locale/TimeZone come from init args for rounding only */
|
||||||
|
|
||||||
|
/** TimeZone for DateMath (UTC) */
|
||||||
|
protected static final TimeZone MATH_TZ = UTC;
|
||||||
|
/** Locale for DateMath (Locale.US) */
|
||||||
|
protected static final Locale MATH_LOCALE = Locale.US;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fixed TimeZone (UTC) needed for parsing/formating Dates in the
|
||||||
|
* canonical representation.
|
||||||
|
*/
|
||||||
|
protected static final TimeZone CANONICAL_TZ = UTC;
|
||||||
|
/**
|
||||||
|
* Fixed Locale needed for parsing/formating Milliseconds in the
|
||||||
|
* canonical representation.
|
||||||
|
*/
|
||||||
|
protected static final Locale CANONICAL_LOCALE = Locale.US;
|
||||||
|
|
||||||
// The XML (external) date format will sort correctly, except if
|
// The XML (external) date format will sort correctly, except if
|
||||||
// fractions of seconds are present (because '.' is lower than 'Z').
|
// fractions of seconds are present (because '.' is lower than 'Z').
|
||||||
|
@ -127,8 +146,7 @@ public class DateField extends FieldType {
|
||||||
*/
|
*/
|
||||||
public Date parseMath(Date now, String val) {
|
public Date parseMath(Date now, String val) {
|
||||||
String math = null;
|
String math = null;
|
||||||
/* :TODO: let Locale/TimeZone come from init args for rounding only */
|
final DateMathParser p = new DateMathParser(MATH_TZ, MATH_LOCALE);
|
||||||
final DateMathParser p = new DateMathParser(UTC, Locale.US);
|
|
||||||
|
|
||||||
if (null != now) p.setNow(now);
|
if (null != now) p.setNow(now);
|
||||||
|
|
||||||
|
@ -243,13 +261,14 @@ public class DateField extends FieldType {
|
||||||
private static class ISO8601CanonicalDateFormat extends SimpleDateFormat {
|
private static class ISO8601CanonicalDateFormat extends SimpleDateFormat {
|
||||||
|
|
||||||
protected NumberFormat millisParser
|
protected NumberFormat millisParser
|
||||||
= NumberFormat.getIntegerInstance(Locale.US);
|
= NumberFormat.getIntegerInstance(CANONICAL_LOCALE);
|
||||||
|
|
||||||
protected NumberFormat millisFormat = new DecimalFormat(".###");
|
protected NumberFormat millisFormat = new DecimalFormat(".###",
|
||||||
|
new DecimalFormatSymbols(CANONICAL_LOCALE));
|
||||||
|
|
||||||
public ISO8601CanonicalDateFormat() {
|
public ISO8601CanonicalDateFormat() {
|
||||||
super("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
|
super("yyyy-MM-dd'T'HH:mm:ss", CANONICAL_LOCALE);
|
||||||
this.setTimeZone(UTC);
|
this.setTimeZone(CANONICAL_TZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Date parse(String i, ParsePosition p) {
|
public Date parse(String i, ParsePosition p) {
|
||||||
|
@ -294,8 +313,9 @@ public class DateField extends FieldType {
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
ISO8601CanonicalDateFormat c
|
ISO8601CanonicalDateFormat c
|
||||||
= (ISO8601CanonicalDateFormat) super.clone();
|
= (ISO8601CanonicalDateFormat) super.clone();
|
||||||
c.millisParser = NumberFormat.getIntegerInstance(Locale.US);
|
c.millisParser = NumberFormat.getIntegerInstance(CANONICAL_LOCALE);
|
||||||
c.millisFormat = new DecimalFormat(".###");
|
c.millisFormat = new DecimalFormat(".###",
|
||||||
|
new DecimalFormatSymbols(CANONICAL_LOCALE));
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue