最近使用Lucene.NET做日期字段排序,使用Lucene.NET的日期转换函数生成的Long类型数据只能使用String比较方式,但使用Int方式拥有更高的效率,所以编写了此函数,只能精确到分钟,对日期精度要求高的场合就没办法了,见代码:
Code
1 /**//// <summary>
2 /// 日期和整数互相转换,精确到分钟。
3 /// 日期从1900年1月1日00:00开始到2156年12月31日53:59结束
4 /// </summary>
5 public static class DateTimeConvert
6 {
7 public const int DEFAULTYEAR = 1900;
8 /**//// <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 {
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 {
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 {
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 {
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 {
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 {
52 bitArray[i + 20] = boolArray[i];
53 }
54 return ToInt32(bitArray);
55 }
56 public static DateTime ToDateTime(int datetime)
57 {
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 {
82 BitArray bitArray = new BitArray(length);
83 for (int i = 0; i < length; i++)
84 {
85 bitArray[i] = bits[pos + i];
86 }
87 return bitArray;
88 }
89 private static byte ToByte(BitArray bitArray)
90 {
91 byte[] intArray = new byte[1];
92 bitArray.CopyTo(intArray, 0);
93 return intArray[0];
94 }
95 /**//// <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 {
103 bool[] bs = new bool[length];
104 int size = sizeof(byte) * 8;
105 for (int i = 0; i < length; i++)
106 {
107 bs[i] = System.Convert.ToBoolean(((byte)(b << (size - 1 - i))) >> (size - 1));
108 }
109 return bs;
110
111 //上面的算法拥有更高的效率
112
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 /**//// <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 {
129 bool[] bs = new bool[length];
130 int size = sizeof(int) * 8;
131 for (int i = 0; i < length; i++)
132 {
133 bs[i] = System.Convert.ToBoolean(((int)(value << (size - 1 - i))) >> (size - 1));
134 }
135 return bs;
136
137 //上面的算法拥有更高的效率
138
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 /**//// <summary>
148 /// 将BitArray转换成整数
149 /// </summary>
150 /// <param name="bitArray">BitArray</param>
151 /// <returns>Int32</returns>
152 private static int ToInt32(BitArray bitArray)
153 {
154 int[] intArray = new int[1];
155 bitArray.CopyTo(intArray, 0);
156 return intArray[0];
157 }
158 }
好久没写博客了。关于日期排序如果大家有更好的办法,不惜赐教。
1 /**//// <summary>
2 /// 日期和整数互相转换,精确到分钟。
3 /// 日期从1900年1月1日00:00开始到2156年12月31日53:59结束
4 /// </summary>
5 public static class DateTimeConvert
6 {
7 public const int DEFAULTYEAR = 1900;
8 /**//// <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 {
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 {
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 {
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 {
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 {
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 {
52 bitArray[i + 20] = boolArray[i];
53 }
54 return ToInt32(bitArray);
55 }
56 public static DateTime ToDateTime(int datetime)
57 {
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 {
82 BitArray bitArray = new BitArray(length);
83 for (int i = 0; i < length; i++)
84 {
85 bitArray[i] = bits[pos + i];
86 }
87 return bitArray;
88 }
89 private static byte ToByte(BitArray bitArray)
90 {
91 byte[] intArray = new byte[1];
92 bitArray.CopyTo(intArray, 0);
93 return intArray[0];
94 }
95 /**//// <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 {
103 bool[] bs = new bool[length];
104 int size = sizeof(byte) * 8;
105 for (int i = 0; i < length; i++)
106 {
107 bs[i] = System.Convert.ToBoolean(((byte)(b << (size - 1 - i))) >> (size - 1));
108 }
109 return bs;
110
111 //上面的算法拥有更高的效率
112
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 /**//// <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 {
129 bool[] bs = new bool[length];
130 int size = sizeof(int) * 8;
131 for (int i = 0; i < length; i++)
132 {
133 bs[i] = System.Convert.ToBoolean(((int)(value << (size - 1 - i))) >> (size - 1));
134 }
135 return bs;
136
137 //上面的算法拥有更高的效率
138
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 /**//// <summary>
148 /// 将BitArray转换成整数
149 /// </summary>
150 /// <param name="bitArray">BitArray</param>
151 /// <returns>Int32</returns>
152 private static int ToInt32(BitArray bitArray)
153 {
154 int[] intArray = new int[1];
155 bitArray.CopyTo(intArray, 0);
156 return intArray[0];
157 }
158 }