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
리턴한다 DateTime
A를 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);
}
ToUniversalTime
Local
(또는 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 ()을 사용해야합니다.