1

エポック時間から までのミリ秒を返す単純なメソッドを作成するとDateTime.UtcNow、適切な答えが得られます。ただし、任意の日付とエポック時間の間のミリ秒を返すメソッドを作成すると、最後の 3 桁は常にゼロになります。「任意の日付」とは、DateTime.Parse("任意の日付文字列") の出力をメソッドに渡すことを意味します。私が理解できる限り、.Parse によって返される DateTime オブジェクトは有効数字をすべて返していません。

試験方法:

    static void GetMillis()
        {
            DateTime dUtc = DateTime.UtcNow;
            DateTime epoch = new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc);
            double utcmillis = (dUtc - epoch).TotalMilliseconds;
            String timestamp = dUtc.ToString();
            DateTime arbitrary = (DateTime.Parse(timestamp));
            Console.WriteLine("Milliseconds between DateTime.UtcNow {0} \nand epoch time {1} are {2}", dUtc, epoch, utcmillis);
            Console.WriteLine("Milliseconds between arbitrary date {0} \nand epoch time {1} are {2}", arbitrary, epoch, (arbitrary - epoch).TotalMilliseconds);
        }

出力:

C:\src\vs\epochConverter\epochConverter\bin\Debug
{powem} [54] --> .\epochConverter.exe -debug
Milliseconds between DateTime.UtcNow 8/26/2012 11:12:31 PM
and epoch time 1/1/1970 12:00:00 AM are 1346022751385.8
Milliseconds between arbitrary date 8/26/2012 11:12:31 PM
and epoch time 1/1/1970 12:00:00 AM are 1346022751000

私がグロテスクに間違ったことをしているのか、ここで数学を理解していないのかわかりません。MSDN で調査しましたが、この違いに関連するものは見つかりません。説明されているようにミリ秒を計算できるようにしたいと本当に思っています-それは可能ですか?

ありがとう。

mp

4

3 に答える 3

3

次の中間値を調べます。

String timestamp = dUtc.ToString();

返されるものはローカル設定によって異なりますが、次のようなものになります。8/26/2012 11:12:31これは、最も近い秒までしか正確ではありません。

もちろん、それを解析すると、0ミリ秒の日時が得られます。

したがって、ミリ秒-since-epoch メソッドがその時点でゼロであることは正しいことです。

ただし、次のようなことをした場合:

arbitrary = new DateTime(2012, 8, 26, 11, 12, 31, 123);

この 123 ミリ秒が結果に影響します。ToString秒の端数を含む aと aを使用することもParseExact、DateTime を取得する他の方法を多数使用することもできます。

全体として、エポックからのミリ秒は完全に機能しましたが、それをテストするための日付を取得する方法に欠陥がありました。

于 2012-08-26T23:29:31.080 に答える
1

デフォルトのDateTime.ToString()形式にはミリ秒が含まれていません。これは、データが失われている場所です。の前に発生しParseます。文字列表現でミリ秒を取得するには、カスタム形式を使用します。

DateTime.UtcNow.ToString()
// -> 8/26/2012 11:37:24 PM
DateTime.Parse("8/26/2012 11:37:24 PM").Millisecond
// -> 0

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffK") 
// -> 2012-08-26T23:41:17.3085938Z
DateTime.Parse("2012-08-26T23:41:17.3085938Z").Millisecond
// -> 308

less と入力するには、ラウンドトリップ ("O", "o") 形式指定子 を参照してください。または、この場合、変換を完全に回避することを検討してください:-)

数学は健全です。

于 2012-08-26T23:29:04.770 に答える
0

ここでは、数学は合理的に見えます。1 秒には 1000 ミリ秒があることを忘れないでください。そのため、ミリ秒を含まない任意の時間とミリ秒を含むほぼ同じ時間からの日付計算には、+/- 1000 ミリ秒の誤差があります。

于 2012-08-26T23:30:56.860 に答える