C#.NETを使用して現在のタイムゾーンを無視して、datetimeをタイムスタンプに変換するにはどうすればよいですか?
私は以下のコードを使用しています:
private long ConvertToTimestamp(DateTime value)
{
long Epoch = (value.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
return Epoch;
}
しかし、現在のタイムゾーンに従ってタイムスタンプ値を返します&現在のタイムゾーンを使用せずに結果が必要です。
現時点では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;
}
編集:コメントに記載されているように、引き算を実行するときに、渡すKind
のDateTime
は考慮されません。これが機能するためには、Kind
がUtc
の値を実際に渡す必要があります。残念ながら、DateTime
はこの点で少し壊れています。詳細については、 私のブログ投稿 (DateTime
についての暴言)を参照してください。
私の Noda Time date/time APIを代わりに使用することをお勧めします。
あなたが何を望んでいるのか、私には正確にはわかりません。タイムスタンプが必要ですか?その後、次のような簡単なことができます。
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);
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);
}
JonSkeetには良い答えがありますが、代替として、結果をよりポータブルに保ちたい場合、日付を ISO 8601 形式に変換することができます。要件。
value.ToUniversalTime().ToString("O");