最近使用Lucene.NET做日期字段排序,使用Lucene.NET的日期转换函数生成的Long类型数据只能使用String比较方式,但使用Int方式拥有更高的效率,所以编写了此函数,只能精确到分钟,对日期精度要求高的场合就没办法了,见代码:
1

/**//// <summary>2
/// 日期和整数互相转换,精确到分钟。3
/// 日期从1900年1月1日00:00开始到2156年12月31日53:59结束4
/// </summary>5
public static class DateTimeConvert6

{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
}