我为自己工作,我是一名自雇编码员,因此我没有代码审查的奢侈品或基于同行编程的改进能力。我将使用它作为练习,看看StackOverflow社区是否可以帮助我查看我编写的一个简单方法;
internal static DateTime CONVERT_To_DateTime(int binDate)
{
// 3/10/2008 = 1822556159
// 2/10/2008 = 1822523391
// 1/10/2008 = 1822490623
// 30/09/2008 = 1822392319
// 29/09/2008 = 1822359551
// September 30th 2008
// 1822392319 = 0x6c9f7fff
// 0x6c = 108 = 2008 (based on 1900 start date)
// 0x9 = 9 = September
// 0xf7fff - take top 5 bits = 0x1e = 30
// October 1st 2008
// 1822490623 = 0x6ca0ffff
// 0 x6c = 108 = 2008
// 0 xa = 10 = October
// 0x0ffff - take top 5 bits = 0x01 = 1
// OR using Binary (used by this function)
// a = 1822556159 (3/10/2008)
// 1101100 1010 00011 111111111111111
// b = 1822523391 (2/10/2008)
// 1101100 1010 00010 111111111111111
// c = 1822490623 (1/10/2008)
// 1101100 1010 00001 111111111111111
// D = 1822392319 (30/09/2008)
// 1101100 1001 11110 111111111111111
// Excess 111111 are probably used for time/seconds which
// we do not care for at the current time
var BaseYear = 1900;
// Dump the long date to binary
var strBinary = Convert.ToString(binDate);
// Calculate the year
var strBYear = strBinary.Substring(0, 7);
var iYear = Convert.ToInt32(strBYear, 2) + BaseYear;
// Calculate the month
var strBMonth = strBinary.Substring(7, 4);
var iMonth = Convert.ToInt32(strBMonth, 2);
// Calculate the day
var strBDay = strBinary.Substring(11, 5);
var iDay = Convert.ToInt32(strBDay, 2);
// ensure that month and day have two digits
var strDay = iDay < 10 ? "0" + iDay : iDay.ToString();
var strMonth = iMonth < 10 ? "0" + iMonth : iMonth.ToString();
// Build the final date
var convertedDate = iYear + strMonth + strDay;
return DateTime.ParseExact(convertedDate, "yyyyMMdd", null);
}
这是一种采用数字表示日期并将其转换为DateTime数据类型的方法。我希望通过审查方法来实现最快的执行时间,因为它是在循环中执行的。
对此方法的任何评论都表示赞赏,因为这对我来说是一个练习。我期待着一些回应。
答案 0 :(得分:10)
而不是转换为字符串,然后转换为整数,然后转换为字符串,然后转换为日期,只需通过移位和屏蔽来获取整数,并直接从整数值创建DateTime值:
binDate >>= 15;
int day = binDate & 31;
binDate >>= 5;
int month = binDate & 15;
binDate >>= 8;
int year = binDate + 1900;
return new DateTime(year, month, day);
答案 1 :(得分:4)
你正在进行字符串操作。当在紧密循环中使用时,这是真正的性能杀手。
static DateTime ToDateTime(int value)
{
var year = (int)((value & 0xff000000) >> 24);
var month = (value & 0xf00000) >> 20;
var day = (value & (0xf8000)) >> 15;
return new DateTime(1900 + year, month, day);
}
这是你如何做到的。首先,取1822490623
并将其转换为二进制:
0110 1100 1010 0000 1111 1111 1111 1111
这是一年的面具:
f f 0 0 0 0 0 0
这是月份:
0 0 f 0 0 0 0 0
这是白天:
0 0 0 f 8 0 0 0
“年”值必须右移6 * 4
位,“月” - 5 * 4
和“日” - 3 * 4 + 3
位。
答案 2 :(得分:4)
欢迎来到社区Phillis。 :)
Anton是正确的,你的字符串操作会很慢。因为看起来你正在使用参数作为位域,我建议调查各种(更快)位运算符:&lt;&lt;,&gt;&gt;,&amp;,|和〜。看起来你正在尝试二进制操作,所以使用为它构建的运算符。
E.g。 (未经测试,刚刚脱下袖口):
您的值为0x6c9f7fff
。高阶字节构成了一年。要掩盖不是年份的所有事情,请执行以下操作:
int year = ((binDate & 0xFF000000) >> 24) + BaseYear;
同样,接下来的4位是月份,所以:
int month = (binDate & 0x00F00000) >> 20;
int date = (binDate & 0x000F8000) >> 15;
return new DateTime(year, month, date);
答案 3 :(得分:-2)
我建议你找一下做类似工作的C / C ++代码;然后将其移植到C#