c# - 重构速度 : Convert To a Date

标签 c# datetime refactoring binary

我为自己工作,我是一名个体户编码员,因此我没有代码审查的奢侈,也没有基于同行编程进行改进的能力。我将以此作为练习,看看 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 值:

binDate >>= 15;
int day = binDate & 31;
binDate >>= 5;
int month = binDate & 15;
binDate >>= 8;
int year = binDate + 1900;
return new DateTime(year, month, day);

关于c# - 重构速度 : Convert To a Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192766/

相关文章:

java - 在 Java 7/Guava 中过滤集合的更干净的方法?

c# - 我如何使用 C# 在选中的列表框中获取新选中项目的文本

javascript - 将 varchar 类型显示为 Date/DateTime 类型

php - 如何使用 php strftime 添加一天

visual-studio-2008 - 通过 ReSharper 将类型从一个项目移动到另一个项目?

language-agnostic - 设计现在是重构的一个子集吗?

c# - 只删除 c# 上的一些 html 标签

c# - 更新键值对中Key的值

c# - 为什么我们需要 .NET 中的引用类型

c++ - 如何获取 ICU 中的所有时区名称