web-dev-qa-db-ja.com

C#でエポック時間をどのように変換しますか?

どのようにしてC#でUnix Epoch time をリアルタイムに変換しますか? (エポックは1970年1月1日に始まります)

332
hsatterwhite

1970年1月1日の午前0時(UTC)からの秒数として定義される nix時間 を意味すると私は思います。

public static DateTime FromUnixTime(long unixTime)
{
    return Epoch.AddSeconds(unixTime);
}
private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
511
LukeH

.Net(v4.6)の最新版 は、Unixの時間変換のサポートを追加しました。これには、秒数またはミリ秒数で表される、Unixとの間の往復の時間が含まれます。

  • UnixからDateTimeOffsetまでの秒数
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
  • DateTimeOffsetからUnixまでの時間(秒):
long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
  • DateTimeOffsetまでのミリ秒単位のUNIX時間:
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
  • ミリ秒単位のUnix時間に対するDateTimeOffset
long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();

注:これらのメソッドはDateTimeOffsetとの間で変換を行います。 DateTime表現を取得するには、単にDateTimeOffset.DateTimeプロパティを使用します。

DateTime dateTime = dateTimeOffset.UtcDateTime;
170
i3arnon

あなたは実際にはAddMilliseconds(ミリ秒)を望み、秒ではありません。秒を追加すると、範囲外の例外が発生します。

22
Darya

もっと良いパフォーマンスが欲しいなら、このバージョンを使うことができます。

public const long UnixEpochTicks = 621355968000000000;
public const long TicksPerMillisecond = 10000;
public const long TicksPerSecond = TicksPerMillisecond * 1000;

//[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static DateTime FromUnixTimestamp(this long unixTime)
{
    return new DateTime(UnixEpochTicks + unixTime * TicksPerSecond);
}

Net471の下の簡単なベンチマーク(BenchmarkDotNet)から、私はこの数を得ます:

        Method |     Mean |     Error |    StdDev | Scaled |
-------------- |---------:|----------:|----------:|-------:|
         LukeH | 5.897 ns | 0.0897 ns | 0.0795 ns |   1.00 |
      MyCustom | 3.176 ns | 0.0573 ns | 0.0536 ns |   0.54 |

---に対して2倍高速 LukeHのバージョン (パフォーマンスの場合)

これはDateTimeが内部でどのように機能するかに似ています。

8
Jiri Sykora
// convert datetime to unix Epoch seconds
public static long ToUnixTime(DateTime date)
{
    var Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return Convert.ToInt64((date.ToUniversalTime() - Epoch).TotalSeconds);
}

DateTimeオブジェクトにはToUniversalTime()を使用してください。

7
Green Su

私はエポック変換のために以下の拡張方法を使います

public static int GetEpochSeconds(this DateTime date)
    {
        TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
        return (int)t.TotalSeconds;
    }

public static DateTime FromEpochSeconds(this DateTime date, long EpochSeconds)
    {
        var Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        return Epoch.AddSeconds(EpochSeconds);

    }
5
faisal00813

4.6を使用していないのであれば、これが役に立つかもしれませんSource:System.IdentityModel.Tokens

    /// <summary>
    /// DateTime as UTV for UnixEpoch
    /// </summary>
    public static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

    /// <summary>
    /// Per JWT spec:
    /// Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time.
    /// </summary>
    /// <param name="datetime">The DateTime to convert to seconds.</param>
    /// <remarks>if dateTimeUtc less than UnixEpoch, return 0</remarks>
    /// <returns>the number of seconds since Unix Epoch.</returns>
    public static long GetIntDate(DateTime datetime)
    {
        DateTime dateTimeUtc = datetime;
        if (datetime.Kind != DateTimeKind.Utc)
        {
            dateTimeUtc = datetime.ToUniversalTime();
        }

        if (dateTimeUtc.ToUniversalTime() <= UnixEpoch)
        {
            return 0;
        }

        return (long)(dateTimeUtc - UnixEpoch).TotalSeconds;
    }    
0
Siva Kandaraj

UNIX timeを含む timeval struct (seconds、microseconds)を精度を落とさずにDateTimeに変換する必要がある場合は、次のようになります。

DateTime _epochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private DateTime UnixTimeToDateTime(Timeval unixTime)
{
    return _epochTime.AddTicks(
        unixTime.Seconds * TimeSpan.TicksPerSecond +
        unixTime.Microseconds * TimeSpan.TicksPerMillisecond/1000);
}
0
i3arnon

メソッドを使用するDateTimeOffset.ToUnixTimeMilliseconds()1970-01-01T00:00:00.000Zから経過したミリ秒数を返します。

これはFramework 4.6以上でのみサポートされています。

var Epoch = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

これはよく文書化されています DateTimeOffset.ToUnixTimeMilliseconds

0
Vinod Srivastav