[C#] DateTime을 1970 년 이후의 초 수로 어떻게 변환 할 수 있습니까?

C # DateTime 변수를 Unix 시간, 즉 1970 년 1 월 1 일 이후의 초 수로 변환하려고합니다. 실제로 DateTime이 0001 년 1 월 1 일 이후의 ‘틱’수로 구현 된 것 같습니다.

내 현재 생각은 다음과 같이 내 DateTime에서 1970 년 1 월 1 일을 빼는 것입니다.

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;

더 좋은 방법이 있습니까?



답변

그게 기본입니다. 다음은 Unix epoch 시간으로 변환하는 데 사용하는 방법입니다.

public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    return origin.AddSeconds(timestamp);
}

public static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    TimeSpan diff = date.ToUniversalTime() - origin;
    return Math.Floor(diff.TotalSeconds);
}

업데이트 : .Net Core 2.1 및 .Net Standard 2.1부터 Unix Epoch와 동일한 DateTime은 static DateTime.UnixEpoch.


답변

시스템의 나머지 부분이 DateTime 대신 DateTimeOffset으로 정상이면 정말 편리한 기능이 있습니다.

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();


답변

내가 보는 유일한 것은 UTC 1970 년 1 월 1 일 자정 이후로 예정되어 있다는 것입니다.

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;


답변

시간대 문제를 피하기 위해 DateTime.UtcNow를 사용하고 싶을 것입니다.

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 


답변

문제의 날짜-시간이 UTC이거나 일광 절약 시간을 한 번도 본 적이없는 지역의 현지 시간을 나타내는 경우 이러한 접근 방식이 좋습니다. DateTime 차이 루틴은 일광 절약 시간을 고려하지 않으므로 결과적으로 6 월 1 일 자정을 1 월 1 일 자정 이후 24 시간의 배수로 간주합니다. Windows에서 현재에 대한 과거 일광 절약 규칙을보고하는 항목을 알지 못합니다. 로케일 때문에 가장 최근의 일광 절약 규칙이 변경되기 전에 언제라도 올바르게 처리 할 수있는 좋은 방법이 없다고 생각합니다.


답변

DateTime의 startTime 및 endTime을 만든 다음 endTime.Subtract (startTime)을 수행 할 수 있습니다. 그런 다음 스팬을 출력하십시오.

그게 효과가 있다고 생각합니다.


답변

미적분학에서 Epoch Time 대신 2000 년을 사용합니다. 더 작은 숫자로 작업하는 것은 저장 및 전송이 쉽고 JSON 친화적입니다.

2000 년은 epoch 시간의 두 번째 946684800이었습니다.

2000 년은 0001 년 1 월 1 일에서 두 번째 63082281600이었습니다.

DateTime.UtcNow Ticks는 0001 년 1 월 1 일부터 시작됩니다.

2000 년 대비 초 :

DateTime.UtcNow.Ticks/10000000-63082281600

Unix 시간의 초 :

DateTime.UtcNow.Ticks/10000000-946684800

예를 들어 2020 년은 다음과 같습니다.

var year2020 = (new DateTime ()). AddYears (2019) .Ticks; // DateTime은 이미 1 년차에 시작하기 때문에

637134336000000000 1 월 1 일 이후 틱 0001

0001 년 1 월 1 일 이후 63713433600 초

에포크 시간 이후 1577836800 초

631152000 2000 년 이후 초

참조 :

Epoch 시간 변환기 : https://www.epochconverter.com

1 년차 변환기 : https://www.epochconverter.com/seconds-days-since-y0