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.