0

私は8バイト、単一の「長い」(別名int64)値であると言われ、16進数に変換された日付値を持っています:

60f347d15798c901

PHPを使用して、これとこのような値を時間/日付に変換するにはどうすればよいですか?

それを 10 進数に変換すると、96 243 71 209 87 152 201 1 となります。

もう少し情報: 元の値は C# の DateTime であり、約 2 週間または 3 週間前の時刻/日付を表す必要があります。

4

5 に答える 5

4

私はいくつかのより関連性のある情報を指し示すかもしれない別の参考文献を見つけました。この場合、レジストリで使用されているWindowsの日付と時刻。どうやらこれらも64ビット値として保存されます。

これは、C?01で終わることがこのタイプの日付の指標であると述べているため、もう少し役立つように見えます。これはリトルエンディアン(つまり、右側の最上位バイト)であるため、バイトは一度に2桁の16進数を反転せずに、hexdec()のバイト順序が間違っていることに注意してください(つまり、右端の2桁の16進数で開始します。次に次の2つなど)。

そして、この情報源によると、

1つのティックは、100ナノ秒または1000万分の1秒を表します。このプロパティの値は、0001年1月1日深夜12:00:00から経過した100ナノ秒間隔の数を表します。

残念ながら、PHPは64ビット整数を処理できないということです。32ビットで最大になります。フロートは役に立ちますが、それでもhexdec()自体がintにのみ対処するのを止めることはできません。したがって、この計算を行うのは複雑かもしれません。それでも2つに分割し、より重要な値をfloatにキャストし、それに2 ^ 32を掛けて、floatとしてキャストすることにより、それらをfloatに結合する必要がある場合があります。 64ビットハードウェア用に構築されたPHPにはこの制限がない可能性がありますが、確かなことはわかりません。

于 2009-03-04T14:56:37.697 に答える
1

指定した値は 36 桁の 16 進数、つまり 18 バイト相当です。それは16進数に変換されたものではありません。Int64

フォーマットの説明をしてくれた人に戻って、今度は真実を話すように頼んでください :)

編集: わかりました、次のステップ: その数字が実際に何を意味するのかを調べてください。1970年以降のダニ?AD 1 以降のミリス? サンプル文字列が何を表しているか知っていますか?

于 2009-03-04T13:47:10.250 に答える
1

で10進数のintに変換できると思います。hexdec(). それは、作業できるタイムスタンプになりますdate().

于 2009-03-04T13:56:57.527 に答える