DateTimeを1970年からの秒数に変換するにはどうすればよいですか?


119

C#のDateTime変数をUnixの時間、つまり1970年1月1日からの秒数に変換しようとしています。DateTimeは、実際には0001年1月1日からの「ティック」の数として実装されているようです。

私の現在の考えは、次のように、DateTimeから1970年1月1日を引くことです。

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;

もっと良い方法はありますか?


回答:


195

基本的にはそれだけです。これらは、Unixエポック時間との間で変換するために使用する方法です。

public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    return origin.AddSeconds(timestamp);
}

public static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    TimeSpan diff = date.ToUniversalTime() - origin;
    return Math.Floor(diff.TotalSeconds);
}

更新:.Net Core 2.1および.Net Standard 2.1以降、Unixエポックに等しいDateTimeはstaticから取得できますDateTime.UnixEpoch


1
より正確なタイムスタンプまたはJavaScriptのDate()オブジェクトの互換性のためにミリ秒に変換する場合は、タイムスタンプタイプにintではなくlongを使用する必要があることに注意してください。
2013

3
うまくいきませんでした。:この答えは、トリックでしstackoverflow.com/questions/249760/...
Zeezer

@Jonny-ToUniversalTime()はUTCに変換するため、UTCを考慮します。
Dave Swersky、2014

4
DateTime origin = new DateTime(1970、1、1、0、0、0、0、DateTimeKind.Utc); 興味深いのは、誰もこれを提案していないことです。多くの場合、UTC時間を表すミリ秒があります。また、t specify this explicitly and somewhere later in code youデフォルトではDateTimeはUtcではないため、ToUniversalTime()を使用しないとUtc時間は不正になります。
2015

52

システムの残りの部分が、DateTimeの代わりにDateTimeOffsetで問題がない場合、非常に便利な機能があります。

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();

7
これは、クリーンな方法ですが、それは、フレームワーク4.6でのみ利用可能ですmsdn.microsoft.com/en-us/library/...
オスカーFraxedas

1
いいね。もちろん、UnixからDateTimeOffsetに移行する場合は、var time = DateTimeOffset.FromUnixTimeSeconds(5000); MS Doc
ジョーダン

22

1970年1月1日午前0時からのはずです

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;

7
DateTime.UtcNowである必要がありますか?
oferei 2017年

14

タイムゾーンの問題を回避するために、おそらくDateTime.UtcNowを使用したいでしょう。

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 

タイムゾーンの問題を回避する唯一の方法は、1)穏やかに無知のままで、1つのタイムゾーンのみをサポートするか、2)別のシステムまたはエンドユーザーとインターフェースするすべての場所で(少なくとも)タイムゾーンを処理することです。特に、内部でどこでもUTCを使用することは、戦いの一部にすぎません。最初のシナリオでは、UTCの日時を追加すると、実際に問題が悪化します。これは、(2)のすべてを実行する準備ができるまで続きます。1つのタイムゾーンのサポートからUTCのみのサポートに移行するためです。
jpaugh、

1

問題の日付時刻がUTCである場合、または夏時間をまったく観測していない地域の現地時間を表す場合、このアプローチは適切です。DateTime差分ルーチンでは夏時間は考慮されないため、6月1日の真夜中が1月1日の真夜中の24時間の倍数であると見なされます。ロケールなので、最新の夏時間規則変更の前の時間を正しく処理するための良い方法はないと思います。


0

DateTimeのstartTimeとendTimeを作成してから、endTime.Subtract(startTime)を実行できます。次に、span.Secondsを出力します。

私はそれでうまくいくと思います。


0

私の計算では、エポックタイムの代わりに2000年を使用しています。小さい数での作業は、保存と転送が簡単で、JSONに対応しています。

2000年はエポックタイムの2番目の946684800でした。

2000年は、0001年1月1日から2番目の63082281600でした。

DateTime.UtcNowティックは、0001年1月1日から始まります

2000年からの秒数

DateTime.UtcNow.Ticks/10000000-63082281600

Unix時間からの秒数:

DateTime.UtcNow.Ticks/10000000-946684800

たとえば、2020年は次のとおりです。

var year2020 =(new DateTime())。AddYears(2019).Ticks; // DateTimeはすでに1年目から始まっているため

637134336000000000 1月1日からのティック0001

63713433600 0001年1月1日からの秒数

エポックタイムから1577836800秒

631152000 2000年からの秒数

参照:

エポックタイムコンバーター:https : //www.epochconverter.com

1年目のコンバーター:https : //www.epochconverter.com/seconds-days-since-y0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.