最近使用Lucene.NET做日期字段排序,使用Lucene.NET的日期转换函数生成的Long类型数据只能使用String比较方式,但使用Int方式拥有更高的效率,所以编写了此函数,只能精确到分钟,对日期精度要求高的场合就没办法了,见代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
2
/// 日期和整数互相转换,精确到分钟。
3
/// 日期从1900年1月1日00:00开始到2156年12月31日53:59结束
4
/// </summary>
5
public static class DateTimeConvert
6![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
7
public const int DEFAULTYEAR = 1900;
8![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
9
/// 将日期转换成整数(精确到分),日期从1900年1月1日00:00开始到2156年12月31日53:59结束
10
/// </summary>
11
/// <param name="datetime"></param>
12
/// <returns></returns>
13
public static int ToInt32(DateTime datetime)
14![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
15
//使用28位表示一个日期
16
BitArray bitArray = new BitArray(28);
17
bool[] boolArray;
18
//获取并设置分钟(分钟占6 bit)
19
byte minute = (byte)datetime.Minute;
20
boolArray = Convert(minute, 6);
21
for (int i = 0; i < 6; i++)
22![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
23
bitArray[i] = boolArray[i];
24
}
25
//获取并设置小时(小时占5 bit)
26
byte hour = (byte)datetime.Hour;
27
boolArray = Convert(hour, 5);
28
for (int i = 0; i < 5; i++)
29![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
30
bitArray[i + 6] = boolArray[i];
31
}
32
//获取并设置日(日占5 bit)
33
byte day = (byte)datetime.Day;
34
boolArray = Convert(day, 5);
35
for (int i = 0; i < 5; i++)
36![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
37
bitArray[i + 11] = boolArray[i];
38
}
39
//获取并设置月(月占4 bit)
40
byte month = (byte)datetime.Month;
41
boolArray = Convert(month, 4);
42
for (int i = 0; i < 4; i++)
43![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
44
bitArray[i + 16] = boolArray[i];
45
}
46
//获取并设置年(年占8 bit)
47
int year = datetime.Year;
48
year = year - DEFAULTYEAR;
49
boolArray = Convert(year, 8);
50
for (int i = 0; i < 8; i++)
51![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
52
bitArray[i + 20] = boolArray[i];
53
}
54
return ToInt32(bitArray);
55
}
56
public static DateTime ToDateTime(int datetime)
57![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
58
byte[] bytes = BitConverter.GetBytes(datetime);
59
//日期
60
BitArray bitArray = new BitArray(bytes);
61
BitArray bits;
62
//获取并设置分钟(分钟占6 bit)
63
bits = CopyTo(bitArray, 0, 6);
64
byte minute = ToByte(bits);
65
//获取并设置小时(小时占5 bit)
66
bits = CopyTo(bitArray, 6, 5);
67
byte hour = ToByte(bits);
68
//获取并设置日(日占5 bit)
69
bits = CopyTo(bitArray, 11, 5);
70
byte day = ToByte(bits);
71
//获取并设置月(月占4 bit)
72
bits = CopyTo(bitArray, 16, 4);
73
byte month = ToByte(bits);
74
//获取并设置年(年占8 bit)
75
bits = CopyTo(bitArray, 20, 8);
76
int year = ToInt32(bits);
77
year += DEFAULTYEAR;
78
return new DateTime(year, month, day, hour, minute, 0);
79
}
80
private static BitArray CopyTo(BitArray bits, int pos, int length)
81![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
82
BitArray bitArray = new BitArray(length);
83
for (int i = 0; i < length; i++)
84![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
85
bitArray[i] = bits[pos + i];
86
}
87
return bitArray;
88
}
89
private static byte ToByte(BitArray bitArray)
90![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
91
byte[] intArray = new byte[1];
92
bitArray.CopyTo(intArray, 0);
93
return intArray[0];
94
}
95![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
96
/// 将字节转换成给定长度的Bool型数组
97
/// </summary>
98
/// <param name="b">字节</param>
99
/// <param name="length">长度</param>
100
/// <returns>Bool型字节数组</returns>
101
private static bool[] Convert(byte b, int length)
102![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
103
bool[] bs = new bool[length];
104
int size = sizeof(byte) * 8;
105
for (int i = 0; i < length; i++)
106![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
107
bs[i] = System.Convert.ToBoolean(((byte)(b << (size - 1 - i))) >> (size - 1));
108
}
109
return bs;
110![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
111
//上面的算法拥有更高的效率
112![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
113
//BitArray bitArray = new BitArray(new byte[] { b });
114
//bool[] bs = new bool[length];
115
//for (int i = 0; i < length; i++)
116
//{
117
// bs[i] = bitArray[i];
118
//}
119
//return bs;
120
}
121![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
122
/// 将整数转换成给定长度的Bool型数组
123
/// </summary>
124
/// <param name="b">字节</param>
125
/// <param name="length">长度</param>
126
/// <returns>Bool型字节数组</returns>
127
private static bool[] Convert(int value, int length)
128![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
129
bool[] bs = new bool[length];
130
int size = sizeof(int) * 8;
131
for (int i = 0; i < length; i++)
132![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
133
bs[i] = System.Convert.ToBoolean(((int)(value << (size - 1 - i))) >> (size - 1));
134
}
135
return bs;
136![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
137
//上面的算法拥有更高的效率
138![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
139
//BitArray bitArray = new BitArray(new int[] { value });
140
//bool[] bs = new bool[length];
141
//for (int i = 0; i < length; i++)
142
//{
143
// bs[i] = bitArray[i];
144
//}
145
//return bs;
146
}
147![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
148
/// 将BitArray转换成整数
149
/// </summary>
150
/// <param name="bitArray">BitArray</param>
151
/// <returns>Int32</returns>
152
private static int ToInt32(BitArray bitArray)
153![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
154
int[] intArray = new int[1];
155
bitArray.CopyTo(intArray, 0);
156
return intArray[0];
157
}
158
}
好久没写博客了
![](https://www.cnblogs.com/Emoticons/qface/055242240.gif)
。关于日期排序如果大家有更好的办法,不惜赐教。