밀리 초 단위의 DateTime 표현?


81

1970 년 이후 밀리 초 단위의 시간 표시로 변환해야하는 SQL 서버 타임 스탬프가 있습니다. 일반 SQL로이 작업을 수행 할 수 있습니까? 그렇지 않은 경우 DateTimeC # 의 변수 로 추출했습니다 . 이것의 millisec 표현을 얻을 수 있습니까?

고마워,
Teja.


1
후자의 질문에 대해 : (now - Epoch).TotalMilliseconds여기서 nowEpoch날짜 시간 개체입니다.

답변:


143

아마도 UTC에있는 UNIX와 유사한 타임 스탬프로 변환하려고 할 것입니다.

yourDateTime.ToUniversalTime().Subtract(
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    ).TotalMilliseconds

UTC에는 이러한 문제가 없으므로 여름철 문제도 방지됩니다.


2
이것은 출력으로 분수를 제공합니다. 예 : "1552678714362.79" ".79"의 출처는 어디입니까?
Sharif Yazdian

2
@SharifYazdian 정확히 예상 할 수있는 0.79 밀리 초입니다. 시스템 시간은 틱 단위로 측정됩니다. 1 밀리 초에는 10000 틱이 DateTime있고 TimeSpan전체 밀리 초보다 높은 정밀도로 값을 저장합니다. 0.79ms = 7900 틱. 정수가 필요한 경우 long ms = myTimeSpan.TotalTicks / 10000;.
LWChris

2
.NET Core (> 2.1) DateTime.UnixEpoch에서는 날짜를 선언하는 대신 사용할 수 있습니다 .
Thom

1
이 코드에는 문제가 있습니다. DateTime(계약의 메모를보세요 ToUniversalTime)가 현지 시간으로되어 있지 않을 수 있다고 가정합니다 . 예를 들어 시간을 샘플링하는 것이 일반적 DateTime.UtcNow이거나 다른 시간대에있을 수 있습니다.
ceztko

70

C #에서는 다음과 같이 작성할 수 있습니다.

(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds

15
long대신에 캐스트를 제안합니다 int:)
Jon Skeet

4
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);다른 길로 가고 싶다면.
JackMorrissey

@JackMorrissey : AddMilliseconds()유형의 매개 변수가 필요합니다 double. 암시 적 변환이이를 처리하지만 주목할 가치가 있습니다.
Axel Kemper 16.

@JonSkeet int 대신 long으로 캐스팅하는 것이 좋습니다. :)
Roxy'Pro

4
@ Roxy'Pro : int.MaxValue밀리 초 단위는 약 25 일입니다. 유용 할 것 같지 않습니다.
Jon Skeet

35

.NET 4.6부터는 DateTimeOffset객체를 사용 하여 유닉스 밀리 초를 가져올 수 있습니다 . DateTime객체를 받는 생성자가 있으므로 아래에 설명 된대로 객체를 전달할 수 있습니다.

DateTime yourDateTime;
long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();

다른 답변에서 언급했듯이 yourDateTime올바른 Kind지정 이 있는지 확인 하거나 .ToUniversalTime()먼저 UTC 시간으로 변환하는 데 사용 하십시오 .

여기에서에 대해 자세히 알아볼 수 있습니다 DateTimeOffset.


1
ToUnixTimeMilliseconds ()는 실제로 .Net 3.5에 존재하지 않습니다.
NickLokarno

2
에 따르면 MSDN , ToUnixTimeMilliseconds().NET 4.6부터 사용할 수 있습니다
NM

1
@kayleeFrye_onDeck OP는 데이터베이스에서 가져온 타임 스탬프에 대해 질문하므로 귀하의 의견 .Now이이 질문에 직접 적용되지 않습니다.

2
SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000

이것은 완전한 정밀도를 제공하지는 않지만 DATEDIFF(MS...오버플로를 유발합니다. 초가 충분하다면이 작업을 수행해야합니다.


2

unixtimestampmillis C #에 대한 은밀한 datetime에 대한이 다른 솔루션입니다.

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static long GetCurrentUnixTimestampMillis()
{
    DateTime localDateTime, univDateTime;
    localDateTime = DateTime.Now;          
    univDateTime = localDateTime.ToUniversalTime();
    return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
} 

1

Andoma의 대답을 사용하여 이것이 내가하는 일입니다.

이와 같은 Struct 또는 Class를 만들 수 있습니다.

struct Date
    {
        public static double GetTime(DateTime dateTime)
        {
            return dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
        }

        public static DateTime DateTimeParse(double milliseconds)
        {
            return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds).ToLocalTime();
        }

    }

그리고 다음과 같이 코드에서 이것을 사용할 수 있습니다.

DateTime dateTime = DateTime.Now;

double total = Date.GetTime(dateTime);

dateTime = Date.DateTimeParse(total);

도움이 되었기를 바랍니다.


1

DateTimeExtensions 클래스 에는 ToUnixTime()ToUnixTimeMs()메서드 가 있습니다.

DateTime.UtcNow.ToUnixTimeMs()

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