私はstackoverflowを見回しており、提案された質問のいくつかを見ても、答えがないようです.C#でUNIXタイムスタンプを取得するにはどうすればよいですか?
15 に答える
DateTime.UtcNow
1970-01-01 のエポック タイムを使用して減算することにより、C# で UNIX タイムスタンプを取得します。
例えば
Int32 unixTimestamp = (int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
DateTime.UtcNow
DateTime
UNIXタイムスタンプを取得したい任意のオブジェクトに置き換えることができます。
DateTime.UnixEpoch
また、MSFT による文書化が非常に不十分なフィールドもありますが、代わりになる可能性があります。new DateTime(1970, 1, 1)
チックも使えます。私は Windows Mobile 用にコーディングしているため、メソッドの完全なセットはありません。TotalSecondsは利用できません。
long epochTicks = new DateTime(1970, 1, 1).Ticks;
long unixTime = ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond);
また
TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = unixTicks.TotalSeconds;
Brad からのコードの更新: Math.truncate は必要ありません。int または long に変換すると、値が自動的に切り捨てられます。私のバージョンでは、int の代わりに long を使用しています (2038 年には 32 ビットの符号付き整数が不足します)。また、タイムスタンプの解析が追加されました。
public static class DateTimeHelper
{
/// <summary>
/// Converts a given DateTime into a Unix timestamp
/// </summary>
/// <param name="value">Any DateTime</param>
/// <returns>The given DateTime in Unix timestamp format</returns>
public static long ToUnixTimestamp(this DateTime value)
{
return (long)(value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
}
/// <summary>
/// Gets a Unix timestamp representing the current moment
/// </summary>
/// <param name="ignored">Parameter ignored</param>
/// <returns>Now expressed as a Unix timestamp</returns>
public static long UnixTimestamp(this DateTime ignored)
{
return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
}
/// <summary>
/// Returns a local DateTime based on provided unix timestamp
/// </summary>
/// <param name="timestamp">Unix/posix timestamp</param>
/// <returns>Local datetime</returns>
public static DateTime ParseUnixTimestamp(long timestamp)
{
return (new DateTime(1970, 1, 1)).AddSeconds(timestamp).ToLocalTime();
}
}
現在の時刻から 1970 を減算する場合、ほとんどの場合、タイムスパンにはゼロ以外のミリ秒フィールドがあることに注意してください。何らかの理由でミリ秒に関心がある場合は、これを覚えておいてください。
この問題を回避するために私がしたことは次のとおりです。
DateTime now = UtcNow();
// milliseconds Not included.
DateTime nowToTheSecond = new DateTime(now.Year,now.Month,now.Day,now.Hour,now.Minute,now.Second);
TimeSpan span = (date - new DateTime(1970, 1, 1, 0, 0, 0, 0));
Assert.That(span.Milliseconds, Is.EqualTo(0)); // passes.