最近使用Lucene.NET做日期字段排序,使用Lucene.NET的日期转换函数生成的Long类型数据只能使用String比较方式,但使用Int方式拥有更高的效率,所以编写了此函数,只能精确到分钟,对日期精度要求高的场合就没办法了,见代码:
7publicconstintDEFAULTYEAR=1900;
8/**////<summary>9///将日期转换成整数(精确到分),日期从1900年1月1日00:00开始到2156年12月31日53:59结束
10///</summary>11///<paramname="datetime"></param>12///<returns></returns>
13publicstaticintToInt32(DateTimedatetime)
14{
15//使用28位表示一个日期16BitArraybitArray=newBitArray(28);
17bool[]boolArray;
18//获取并设置分钟(分钟占6bit)19byteminute=(byte)datetime.Minute;
20boolArray=Convert(minute,6);
21for(inti=0;i<6;i++)
22{
23bitArray[i]=boolArray[i];
24}25//获取并设置小时(小时占5bit)26bytehour=(byte)datetime.Hour;
27boolArray=Convert(hour,5);
28for(inti=0;i<5;i++)
29{
30bitArray[i+6]=boolArray[i];
31}32//获取并设置日(日占5bit)33byteday=(byte)datetime.Day;
34boolArray=Convert(day,5);
35for(inti=0;i<5;i++)
36{
37bitArray[i+11]=boolArray[i];
38}39//获取并设置月(月占4bit)40bytemonth=(byte)datetime.Month;
41boolArray=Convert(month,4);
42for(inti=0;i<4;i++)
43{
44bitArray[i+16]=boolArray[i];
45}46//获取并设置年(年占8bit)47intyear=datetime.Year;
48year=year-DEFAULTYEAR;
49boolArray=Convert(year,8);
50for(inti=0;i<8;i++)
51{
52bitArray[i+20]=boolArray[i];
53}54returnToInt32(bitArray);
55}56publicstaticDateTimeToDateTime(intdatetime)
57{
58byte[]bytes=BitConverter.GetBytes(datetime);
59//日期60BitArraybitArray=newBitArray(bytes);
61BitArraybits;
62//获取并设置分钟(分钟占6bit)63bits=CopyTo(bitArray,0,6);
64byteminute=ToByte(bits);
65//获取并设置小时(小时占5bit)66bits=CopyTo(bitArray,6,5);
67bytehour=ToByte(bits);
68//获取并设置日(日占5bit)69bits=CopyTo(bitArray,11,5);
70byteday=ToByte(bits);
71//获取并设置月(月占4bit)72bits=CopyTo(bitArray,16,4);
73bytemonth=ToByte(bits);
74//获取并设置年(年占8bit)75bits=CopyTo(bitArray,20,8);
76intyear=ToInt32(bits);
77year+=DEFAULTYEAR;
78returnnewDateTime(year,month,day,hour,minute,0);
79}80privatestaticBitArrayCopyTo(BitArraybits,intpos,intlength)
81{
82BitArraybitArray=newBitArray(length);
83for(inti=0;i<length;i++)
84{
85bitArray[i]=bits[pos+i];
86}87returnbitArray;
88}89privatestaticbyteToByte(BitArraybitArray)
90{
91byte[]intArray=newbyte[1];
92bitArray.CopyTo(intArray,0);
93returnintArray[0];
94}95/**////<summary>96///将字节转换成给定长度的Bool型数组
97///</summary>98///<paramname="b">字节</param>99///<paramname="length">长度</param>100///<returns>Bool型字节数组</returns>
101privatestaticbool[]Convert(byteb,intlength)
102{
103bool[]bs=newbool[length];
104intsize=sizeof(byte)*8;
105for(inti=0;i<length;i++)
106{
107bs[i]=System.Convert.ToBoolean(((byte)(b<<(size-1-i)))>>(size-1));
108}109returnbs;
110
111//上面的算法拥有更高的效率
112
113//BitArraybitArray=newBitArray(newbyte[]{b});
114//bool[]bs=newbool[length];
115//for(inti=0;i<length;i++)
116//{
117//bs[i]=bitArray[i];
118//}
119//returnbs;120}121/**////<summary>122///将整数转换成给定长度的Bool型数组
123///</summary>124///<paramname="b">字节</param>125///<paramname="length">长度</param>126///<returns>Bool型字节数组</returns>
127privatestaticbool[]Convert(intvalue,intlength)
128{
129bool[]bs=newbool[length];
130intsize=sizeof(int)*8;
131for(inti=0;i<length;i++)
132{
133bs[i]=System.Convert.ToBoolean(((int)(value<<(size-1-i)))>>(size-1));
134}135returnbs;
136
137//上面的算法拥有更高的效率
138
139//BitArraybitArray=newBitArray(newint[]{value});
140//bool[]bs=newbool[length];
141//for(inti=0;i<length;i++)
142//{
143//bs[i]=bitArray[i];
144//}
145//returnbs;146}147/**////<summary>148///将BitArray转换成整数
149///</summary>150///<paramname="bitArray">BitArray</param>151///<returns>Int32</returns>
152privatestaticintToInt32(BitArraybitArray)
153{
154int[]intArray=newint[1];
155bitArray.CopyTo(intArray,0);
156returnintArray[0];
157}158}