/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ using System; using Lucene.Net.Search; using Lucene.Net.Support; using NumericUtils = Lucene.Net.Util.NumericUtils; using PrefixQuery = Lucene.Net.Search.PrefixQuery; using TermRangeQuery = Lucene.Net.Search.TermRangeQuery; // for javadoc namespace Lucene.Net.Documents { // for javadoc // do not remove in 3.0, needed for reading old indexes! /// Provides support for converting dates to strings and vice-versa. /// The strings are structured so that lexicographic sorting orders by date, /// which makes them suitable for use as field values and search terms. /// ///

Note that this class saves dates with millisecond granularity, /// which is bad for and , as those /// queries are expanded to a BooleanQuery with a potentially large number /// of terms when searching. Thus you might want to use /// instead. /// ///

/// Note: dates before 1970 cannot be used, and therefore cannot be /// indexed when using this class. See for an /// alternative without such a limitation. /// ///

/// Another approach is , which provides /// a sortable binary representation (prefix encoded) of numeric values, which /// date/time are. /// For indexing a , convert it to unix timestamp as /// long and /// index this as a numeric value with /// and use to query it. /// ///

/// If you build a new index, use or /// instead. /// This class is included for use with existing /// indices and will be removed in a future (possibly Lucene 4.0) /// [Obsolete("If you build a new index, use DateTools or NumericField instead.This class is included for use with existing indices and will be removed in a future release (possibly Lucene 4.0).")] public class DateField { private DateField() { } // make date strings long enough to last a millenium private static int DATE_LEN = Number.ToString(1000L * 365 * 24 * 60 * 60 * 1000, Number.MAX_RADIX).Length; public static System.String MIN_DATE_STRING() { return TimeToString(0); } public static System.String MAX_DATE_STRING() { char[] buffer = new char[DATE_LEN]; char c = Character.ForDigit(Character.MAX_RADIX - 1, Character.MAX_RADIX); for (int i = 0; i < DATE_LEN; i++) buffer[i] = c; return new System.String(buffer); } /// Converts a Date to a string suitable for indexing. /// RuntimeException if the date specified in the /// method argument is before 1970 /// public static System.String DateToString(System.DateTime date) { TimeSpan ts = date.Subtract(new DateTime(1970, 1, 1)); ts = ts.Subtract(TimeZone.CurrentTimeZone.GetUtcOffset(date)); return TimeToString(ts.Ticks / TimeSpan.TicksPerMillisecond); } /// Converts a millisecond time to a string suitable for indexing. /// RuntimeException if the time specified in the /// method argument is negative, that is, before 1970 /// public static System.String TimeToString(long time) { if (time < 0) throw new System.SystemException("time '" + time + "' is too early, must be >= 0"); System.String s = Number.ToString(time, Character.MAX_RADIX); if (s.Length > DATE_LEN) throw new System.SystemException("time '" + time + "' is too late, length of string " + "representation must be <= " + DATE_LEN); // Pad with leading zeros if (s.Length < DATE_LEN) { System.Text.StringBuilder sb = new System.Text.StringBuilder(s); while (sb.Length < DATE_LEN) sb.Insert(0, 0); s = sb.ToString(); } return s; } /// Converts a string-encoded date into a millisecond time. public static long StringToTime(System.String s) { return Number.Parse(s, Number.MAX_RADIX); } /// Converts a string-encoded date into a Date object. public static System.DateTime StringToDate(System.String s) { long ticks = StringToTime(s) * TimeSpan.TicksPerMillisecond; System.DateTime date = new System.DateTime(1970, 1, 1); date = date.AddTicks(ticks); date = date.Add(TimeZone.CurrentTimeZone.GetUtcOffset(date)); return date; } } }