C #에서 Unix epoch 시간 을 실시간으로 어떻게 변환 합니까? (1970 년 1 월 1 일 시작)
답변
1970 년 1 월 1 일 자정 (UTC) 이후의 초 수로 정의되는 Unix 시간 을 의미한다고 가정합니다 .
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);
답변
닷넷 (V4.6)의 최신 버전은 단지 내장 추가 된 유닉스 시간 변환을 지원합니다. 여기에는 초 또는 밀리 초로 표시되는 유닉스 시간과 출발 시간이 모두 포함됩니다.
- 초 단위의 유닉스 시간 DateTimeOffset:
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);- DateTimeOffset초 단위의 유닉스 시간 :
long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();- 밀리 초 단위의 유닉스 시간 DateTimeOffset:
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);- DateTimeOffset밀리 초 단위의 유닉스 시간 :
long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();참고 :이 메소드는로 (과) 변환합니다 DateTimeOffset. DateTime표현 을 얻으려면 단순히 DateTimeOffset.DateTime속성을 사용하십시오 .
DateTime dateTime = dateTimeOffset.UtcDateTime;답변
LukeH에 대한 모든 확신을 가지고 쉽게 사용할 수 있도록 몇 가지 확장 방법을 모았습니다.
public static DateTime FromUnixTime(this long unixTime)
{
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return epoch.AddSeconds(unixTime);
}
public static long ToUnixTime(this DateTime date)
{
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return Convert.ToInt64((date - epoch).TotalSeconds);
}위의 것을 CodesInChaos에서 아래의 설명을 참고 FromUnixTime리턴한다 DateTimeA를 Kind의 Utc괜찮지 만, 위의 어떤은 ToUnixTime훨씬 더 의심 점에서 고려하지 않는 종류의 것입니다 DateTime주어진 date것입니다. 을 허용하기 위해 date의 Kind존재 중 하나 Utc또는 Local사용 ToUniversalTime:
public static long ToUnixTime(this DateTime date)
{
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds);
}ToUniversalTimeLocal(또는 Unspecified) DateTime을 로 변환합니다 Utc.
DateTime에서 epoch로 이동할 때 epoch DateTime 인스턴스를 작성하지 않으려면 다음을 수행하십시오.
public static long ToUnixTime(this DateTime date)
{
    return (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}답변
실제로는 초가 아닌 밀리 초 (밀리 초)를 추가하려고합니다. 초를 추가하면 범위를 벗어난 예외가 발생합니다.
답변
더 나은 성능을 원하면이 버전을 사용할 수 있습니다.
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 |LukeH 버전 보다 2 배 빠름 (성능이 문제가되는 경우)
이것은 DateTime이 내부적으로 작동하는 방식과 유사합니다.
답변
DateTimeOffset.ToUnixTimeMilliseconds () 메소드를 사용하십시오. 1970-01-01T00 : 00 : 00.000Z 이후 경과 된 밀리 초 수를 리턴합니다.
이것은 Framework 4.6 이상에서만 지원됩니다
var EPOCH = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();DateTimeOffset.ToUnixTimeMilliseconds에 잘 설명되어 있습니다.
다른 방법은 다음을 사용하는 것입니다.
long EPOCH = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1,0,0,0,0).Ticks;초만으로 EPOCH를 얻으려면 다음을 사용할 수 있습니다
 var Epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;다음 방법으로 Epoch를 로 변환하십시오.DateTime
private DateTime Epoch2UTCNow(int epoch)
{
    return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch);
}답변
// 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 ()을 사용해야합니다.
