web-dev-qa-db-ja.com

エポック/ UNIXを日時に変換する

これは重複ではない質問です。この質問は、変換の実行方法ではなく、変換方法の問題を示しています。質問を完全に読んでください。

UNIXタイムスタンプと思われるタイムスタンプがあります。次のコンバーターを使用すると、スタンプが正しく変換されます。

値:1365151714493

http://www.epochconverter.com/

私は周りを見回して、これを日時オブジェクトに変換する方法について を見つけました。メソッドは単純に見えます。日時オブジェクトを作成し、日付を1970年1月1日の夜に設定して追加します。 2番目の値:

_public static DateTime? ConvertUnixTimeStamp(string unixTimeStamp)
{
    return new DateTime(1970, 1, 1, 0, 0).AddSeconds(Convert.ToDouble(unixTimeStamp));
}
_

問題は、上記の値でこの方法を呼び出すたびに、範囲外の値の例外が発生することです。

最初に値を使用して何かをする必要がありますか?文字列はdoubleokに変換されます。 AddSeconds(double)メトスを呼び出すと例外がスローされます

13
Andy Clark

そのタイムスタンプ(1365151714493)は、秒ではなくミリ秒単位です。 1000で割るか、代わりにAddMillisecondsを使用する必要があります。秒として扱われる場合、それは約43,259(概算)年先の日付です。これは、1 0000年に 最大 であるDateTimeの範囲を超えているため、ArgumentOutOfRangeExceptionがスローされます。

public static DateTime? ConvertUnixTimeStamp(string unixTimeStamp)
{
    return new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(Convert.ToDouble(unixTimeStamp));
}

V4Vendettaが提案したように、GMTに強制することも検討してください。さらに、フォーマットが混在していると予想される場合(秒ORミリ秒)、解析された値のサイズをすばやくチェックするのが賢明かもしれません。

16
Chris Sinclair

GMTに関してなので、試してみるべきだと思います

また、あなたが言及したサイトからは、値がミリ秒単位であり、従来の 秒単位のunixタイムスタンプ ではないと想定しています。

DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Epoch = Epoch.AddMilliseconds(yourvalue);// your case results to 4/5/2013 8:48:34 AM
6
V4Vendetta