DateField.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:5k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using PrefixQuery = Lucene.Net.Search.PrefixQuery;
  18. using RangeQuery = Lucene.Net.Search.RangeQuery;
  19. namespace Lucene.Net.Documents
  20. {
  21. /// <summary> Provides support for converting dates to strings and vice-versa.
  22. /// The strings are structured so that lexicographic sorting orders by date,
  23. /// which makes them suitable for use as field values and search terms.
  24. /// 
  25. /// <P>Note that this class saves dates with millisecond granularity,
  26. /// which is bad for {@link RangeQuery} and {@link PrefixQuery}, as those
  27. /// queries are expanded to a BooleanQuery with a potentially large number 
  28. /// of terms when searching. Thus you might want to use
  29. /// {@link DateTools} instead.
  30. /// 
  31. /// <P>
  32. /// Note: dates before 1970 cannot be used, and therefore cannot be
  33. /// indexed when using this class. See {@link DateTools} for an
  34. /// alternative without such a limitation.
  35. /// 
  36. /// </summary>
  37. /// <deprecated> If you build a new index, use {@link DateTools} instead. For 
  38. /// existing indices you can continue using this class, as it will not be 
  39. /// removed in the near future despite being deprecated.
  40. /// </deprecated>
  41. public class DateField
  42. {
  43. private DateField()
  44. {
  45. }
  46. // make date strings long enough to last a millenium
  47. private static int DATE_LEN = System.Convert.ToString(
  48.             1000L * 365 * 24 * 60 * 60 * 1000, 36).Length;
  49. public static System.String MIN_DATE_STRING()
  50. {
  51. return TimeToString(0);
  52. }
  53. public static System.String MAX_DATE_STRING()
  54. {
  55. char[] buffer = new char[DATE_LEN];
  56. char c = SupportClass.Character.ForDigit(36 - 1, SupportClass.Character.MAX_RADIX);
  57. for (int i = 0; i < DATE_LEN; i++)
  58. buffer[i] = c;
  59. return new System.String(buffer);
  60. }
  61. /// <summary> Converts a Date to a string suitable for indexing.</summary>
  62. /// <throws>  RuntimeException if the date specified in the </throws>
  63. /// <summary> method argument is before 1970
  64. /// </summary>
  65. public static System.String DateToString(System.DateTime date)
  66. {
  67.             TimeSpan ts = date.Subtract(new DateTime(1970, 1, 1));
  68.             ts = ts.Subtract(TimeZone.CurrentTimeZone.GetUtcOffset(date));
  69.             return TimeToString(ts.Ticks / TimeSpan.TicksPerMillisecond);
  70.         }
  71. /// <summary> Converts a millisecond time to a string suitable for indexing.</summary>
  72. /// <throws>  RuntimeException if the time specified in the </throws>
  73. /// <summary> method argument is negative, that is, before 1970
  74. /// </summary>
  75. public static System.String TimeToString(long time)
  76. {
  77. if (time < 0)
  78. throw new System.SystemException("time too early");
  79. System.String s = SupportClass.Number.ToString(time, SupportClass.Number.MAX_RADIX);
  80. if (s.Length > DATE_LEN)
  81. throw new System.SystemException("time too late");
  82. // Pad with leading zeros
  83. if (s.Length < DATE_LEN)
  84. {
  85. System.Text.StringBuilder sb = new System.Text.StringBuilder(s);
  86. while (sb.Length < DATE_LEN)
  87. sb.Insert(0, 0);
  88. s = sb.ToString();
  89. }
  90. return s;
  91. }
  92. /// <summary>Converts a string-encoded date into a millisecond time. </summary>
  93. public static long StringToTime(System.String s)
  94. {
  95. return SupportClass.Number.Parse(s, SupportClass.Number.MAX_RADIX);
  96. }
  97. /// <summary>Converts a string-encoded date into a Date object. </summary>
  98. public static System.DateTime StringToDate(System.String s)
  99. {
  100.             return new System.DateTime(StringToTime(s));
  101.             // {{Aroush-1.9}} Will the line above do it or do we need the lines below?!
  102.             /*
  103.             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;             */ }
  104. }
  105. }