web-dev-qa-db-ja.com

C#/。NETを使用してdatetimeをタイムスタンプに変換する方法(現在のタイムゾーンを無視する)

C#.NETを使用して現在のタイムゾーンを無視して、datetimeをタイムスタンプに変換するにはどうすればよいですか?

私は以下のコードを使用しています:

private long ConvertToTimestamp(DateTime value)
{
    long Epoch = (value.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
    return Epoch;
}

しかし、現在のタイムゾーンに従ってタイムスタンプ値を返します&現在のタイムゾーンを使用せずに結果が必要です。

24
User

現時点ではToUniversalTime()を呼び出しています-それを取り除くだけです:

private long ConvertToTimestamp(DateTime value)
{
    long Epoch = (value.Ticks - 621355968000000000) / 10000000;
    return Epoch;
}

または、より読みやすいIMO:

private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
...

private static long ConvertToTimestamp(DateTime value)
{
    TimeSpan elapsedTime = value - Epoch;
    return (long) elapsedTime.TotalSeconds;
}

編集:コメントに記載されているように、引き算を実行するときに、渡すKindDateTimeは考慮されません。これが機能するためには、KindUtcの値を実際に渡す必要があります。残念ながら、DateTimeはこの点で少し壊れています。詳細については、 私のブログ投稿DateTimeについての暴言)を参照してください。

私の Noda Time date/time APIを代わりに使用することをお勧めします。

53
Jon Skeet

あなたが何を望んでいるのか、私には正確にはわかりません。タイムスタンプが必要ですか?その後、次のような簡単なことができます。

TimeStamp ts = TimeStamp.FromTicks(value.ToUniversalTime().Ticks);

変数にエポックという名前を付けたので、日付に相当するUnix時間を使用しますか?

DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc);
long Epoch = (long)Math.Floor((value.ToUniversalTime() - unixStart).TotalSeconds);
6
Jensen

DateTimeからタイムスタンプを検索:

private long ConvertToTimestamp(DateTime value)
{
    TimeZoneInfo NYTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime NyTime = TimeZoneInfo.ConvertTime(value, NYTimeZone);
    TimeZone localZone = TimeZone.CurrentTimeZone;
    System.Globalization.DaylightTime dst = localZone.GetDaylightChanges(NyTime.Year);
    NyTime = NyTime.AddHours(-1);
    DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    TimeSpan span = (NyTime - Epoch);
    return (long)Convert.ToDouble(span.TotalSeconds);
}
1
Vivekveer

JonSkeetには良い答えがありますが、代替として、結果をよりポータブルに保ちたい場合、日付を ISO 8601 形式に変換することができます。要件。

value.ToUniversalTime().ToString("O");
0
Bronumski