[C#] C #에서 에포크 시간을 어떻게 변환합니까?

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를 KindUtc괜찮지 만, 위의 어떤은 ToUnixTime훨씬 더 의심 점에서 고려하지 않는 종류의 것입니다 DateTime주어진 date것입니다. 을 허용하기 위해 dateKind존재 중 하나 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 ()을 사용해야합니다.