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


119

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;

더 좋은 방법이 있습니까?


답변:


195

그게 기본입니다. 다음은 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.


1
보다 정확한 타임 스탬프 또는 Javascript Date () 객체 호환성을 위해 밀리 초로 변환하려면 타임 스탬프 유형에 int 대신 long을 사용해야합니다.
Soviut 2013

3
나를 위해 일하지 않았습니다. 이 답변이 트릭을 수행했습니다. stackoverflow.com/questions/249760/…
Zeezer 2014-01-02

@Jonny-ToUniversalTime ()은 UTC로 변환하므로 UTC를 고려합니다.
Dave Swersky 2014

4
DateTime origin = new DateTime (1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 아무도 이것을 제안하지 않았다는 것이 흥미 롭습니다. 매우 자주 Utc 시간을 나타내는 밀리 초가 있습니다. 그리고 당신은 돈 있으면 것은 t specify this explicitly and somewhere later in code you나쁜 UTC 시간으로 끝낼 것보다 기본적으로 날짜 시간은 UTC되지 않기 때문에, ToUniversalTime ()를 가지고 것이다.
steavy

52

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

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();

7
이것은 청소기 방법이지만, 그것은 프레임 워크 4.6에서만 사용할 수 msdn.microsoft.com/en-us/library/...
오스카 Fraxedas

1
좋은. 물론 유닉스에서 DateTimeOffset으로 이동하려면 var time = DateTimeOffset.FromUnixTimeSeconds(5000); MS Doc
Jordan

22

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

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

7
DateTime.UtcNow 여야합니까?
oferei

14

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

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

시간대 문제를 피하는 유일한 방법은 1) 행복하게 무지하고 하나의 시간대 만 지원하거나 2) 다른 시스템 또는 최종 사용자와 인터페이스하는 모든 곳에서 시간대를 처리하는 것입니다 (적어도). 특히 내부적으로 모든 곳에서 UTC를 사용하는 것은 전투의 일부일뿐입니다. 첫 번째 시나리오에서 UTC 날짜 시간을 추가하면 (2) 모든 작업을 수행 할 준비가 될 때까지 실제로 문제가 더 악화됩니다. 하나의 시간대를 지원하는 것에서 UTC 만 지원하는 것으로 이동하기 때문입니다.
jpaugh

1

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


0

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

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


0

미적분학에서 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.