【问题标题】:Converting PHP to .Net C#将 PHP 转换为 .Net C#
【发布时间】:2012-05-16 01:52:42
【问题描述】:

我正在“重新开发”一个前段时间用 PHP 启动的应用程序。涉事的开发者已经离开公司很久了,所有联系他的努力都被搁置了。

我不需要帮助将整个网站转换为一个非常简单的应用程序。但是,我们正在与 API 服务集成(其文档相当差),我无法理解他们的 dateTime 字符串。

这是关于他们如何使用日期时间的摘录(唯一一点)。

" 日期时间表示为使用日月年小时分钟和秒的算法派生的数字,如下所示:

date=year<<20; 
date|=month<<16; 
date|=day<<11; 
date|=hour<<6;
date|=minute; 

从给定的数字中解包日期如下:

year=(date & 0xfff00000) >> 20;
month=(date & 0x000f0000) >> 16;
day=(date & 0x0000f800) >> 11; 
hour=(date & 0x000007c0) >> 6; 
minute=(date & 0x0000003f);

"

现在是我的问题。开发人员(这是一个工作示例)创建了以下 PHP 函数,可将时间戳转换为所需格式。我不确定按位时间戳是否是“通用算法”。

我四处张望,什么都找不到。

/**
 * Converts a unixtime stamp to a bitwise timestamp
 * 
 * @access public
 * @param mixed $unixtime
 * @return void
 */
function convert_unixtime_to_bitwise($unixtime)
{
    /*$year = date('Y', $unixtime);
    $month = date('m', $unixtime);
    $day = date('j', $unixtime);
    $hour = date('G', $unixtime);
    $min = date('i', $unixtime);*/

        $year = date('Y', $unixtime);
    $month = date('m', $unixtime);
    $day = date('j', $unixtime);
    $hour = date('G', $unixtime);
    $min = date('i', $unixtime);

    $date = 0;
    $date = $year << 20;
    $date |= $month << 16;
    $date |= $day <<11;
    $date |= $hour <<6;
    $date |= $min;

    return $date;
}

/**
 * Converts a bitwise datestamp to a standard unixtime stamp
 * 
 * @access public
 * @param mixed $timestamp
 * @return void
 */
function convert_bitwise_to_unixtime($timestamp)
{
    $dateline = array();

    $dateline['year'] = ($timestamp & 0xfff00000) >> 20;
    $dateline['month'] =($timestamp & 0x000f0000) >> 16;
    $dateline['day'] = ($timestamp & 0x0000f800) >> 11;
    $dateline['hour'] = ($timestamp & 0x000007c0) >> 6;
    $dateline['min'] = ($timestamp & 0x0000003f);

    return mktime($dateline['hour'], $dateline['min'], 0, $dateline['month'], $dateline['day'], $dateline['year']);
}

谁能帮我以最简单的方式将其转换为 .Net。理想情况下,我会为 datetime 对象编写一个扩展方法以返回“按位?”对象和扩展方法将按位时间戳转换为日期时间时间戳。理想情况下,我会得到类似于 bel 的东西。

public static class Extensions
{
    public static BitWiseDateStamp ToBitWiseDateStamp(this DateTime timeStamp)
    {
        return BitWiseDateStamp.New(timeStamp);
    }

}

public class BitWiseDateStamp
{
    private string _value;

    public string Value
    {
        get { return _value; }
        set { _value = value; }
    }


    public static BitWiseDateStamp New(DateTime date)
    {
        var b = new BitWiseDateStamp();

        var bitWiseStr = string.Empty; 

        //= Convert to bitwise string format...

        b.Value = bitWiseStr;
        return b;
    }

    public override string ToString()
    {
        return this._value;
    }

    public DateTime ToDateTime()
    {
        var date = DateTime.MinValue;
        var dateStr = string.Empty;

        //== Convert bitwise string to date string respresenation

        DateTime.TryParse(dateStr, out date);
        return date;
    }
}

我非常感谢任何人提供的任何帮助。

干杯,

尼哥

【问题讨论】:

    标签: c# php methods


    【解决方案1】:

    也许我遗漏了什么,但这不是吗?

    public class BitwiseDateStamp
    {
        private readonly int _value;
    
        public BitwiseDateStamp(DateTime dt)
        {
            this._value = dt.Year << 20;
            this._value |= dt.Month << 16;
            this._value |= dt.Day << 11;
            this._value |= dt.Hour << 6;
            this._value |= dt.Minute;
        }
    
        public BitwiseDateStamp() : this(DateTime.Now)
        {   
        }
    
        public DateTime ToDateTime()
        {
            int year = this._value >> 20;
            int month = (this._value & 0x000f0000) >> 16;
            int day = (this._value & 0x0000f800) >> 11;
            int hour = (this._value & 0x000007c0) >> 6;
            int minute = this._value & 0x0000003f;
    
            return new DateTime(year, month, day, hour, minute, 0);
        }
    
        public override string ToString()
        {
            return this._value.ToString();
        }
    }
    

    public static class DateTimeExtensions
    {
        public static BitwiseDateStamp ToBitwiseDateStamp(this DateTime dt)
        {
            return new BitwiseDateStamp(dt);
        }
    }
    

    【讨论】:

    • 现在我什至没有意识到转换这么容易。在这里,我试图在一个完全不同的庄园工作。有时,答案是盯着你的脸。非常感谢
    【解决方案2】:

    我认为不需要 BitWiseDateStamp 类。可以这样实现:

    public static class Extensions
    {
        public static ulong ToDateStamp(this DateTime dt)
        {
            return (dt.Year << 20 | dt.Month << 16 | dt.Day << 11 | dt.Hour << 6 |                        dt.Minute);
        }
    
        public static DateTime FromDateStamp(this ulong stamp)
        {
            return new DateTime((stamp & 0xfff00000) >> 20,
                                (stamp & 0x000f0000) >> 16,
                                (stamp & 0x0000f800) >> 11,
                                (stamp & 0x000007c0) >> 6,
                                (stamp & 0x0000003f),
                                0 // 0 seconds
                               );
        }
    
    }
    

    【讨论】:

    • 虽然这也符合要求,但我使用的是实际对象,因为与 API 服务的集成是在一个单独的程序集中构建的,该程序集将在其他项目中使用。我们需要的是传入的实际对象,而不是仅使用扩展方法。这有助于最大限度地减少用户在将不正确的值传递给使用它的方法时的错误。现在我将扩展方法添加到我自己的程序集(单独的项目)中,以将 ToBitwiseDate 扩展绑定到日期时间。我非常感谢您花时间写此回复。干杯,尼科
    猜你喜欢
    • 2016-04-18
    • 2012-02-26
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多