どのようにしてC#でUnix Epoch time をリアルタイムに変換しますか? (エポックは1970年1月1日に始まります)
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);
.Net(v4.6)の最新版 は、Unixの時間変換のサポートを追加しました。これには、秒数またはミリ秒数で表される、Unixとの間の往復の時間が含まれます。
DateTimeOffset
までの秒数DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
DateTimeOffset
からUnixまでの時間(秒):long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
DateTimeOffset
までのミリ秒単位のUNIX時間:DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
DateTimeOffset
:long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();
注:これらのメソッドはDateTimeOffset
との間で変換を行います。 DateTime
表現を取得するには、単にDateTimeOffset.DateTime
プロパティを使用します。
DateTime dateTime = dateTimeOffset.UtcDateTime;
あなたは実際にはAddMilliseconds(ミリ秒)を望み、秒ではありません。秒を追加すると、範囲外の例外が発生します。
もっと良いパフォーマンスが欲しいなら、このバージョンを使うことができます。
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が内部でどのように機能するかに似ています。
// 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()を使用してください。
私はエポック変換のために以下の拡張方法を使います
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);
}
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;
}
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);
}
メソッドを使用するDateTimeOffset.ToUnixTimeMilliseconds()1970-01-01T00:00:00.000Zから経過したミリ秒数を返します。
これはFramework 4.6以上でのみサポートされています。
var Epoch = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
これはよく文書化されています DateTimeOffset.ToUnixTimeMilliseconds