2

私は、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;
    }
}

誰もが提供できる助けに本当に感謝しています。

乾杯、

ニコ

4

2 に答える 2

2

おそらく私は何かが足りないのですが、これはしませんか?

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);
    }
}
于 2012-05-16T02:14:24.603 に答える
1

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
                           );
    }

}
于 2012-05-16T02:24:47.920 に答える