C #에서 타임 스탬프를 만드는 함수


101

날짜 시간에서 C #으로 타임 스탬프를 만드는 방법이 있는지 궁금합니다. Compact Framework에서도 작동하는 밀리 초 정밀도 값이 필요합니다 (DateTime.ToBinary ()가 CF에 존재하지 않기 때문에).

내 문제는이 값을 데이터베이스에 구애받지 않는 방식으로 저장하여 나중에 정렬하고 다른 값보다 더 큰 값을 찾을 수 있다는 것입니다.


2
여기에 허용 된 답변은 좋은 솔루션을 제공하지만 실시간 타임 스탬프를 원한다면이 Q / A를 확인하십시오. stackoverflow.com/questions/9814060/…
inanutshellus

답변:


206

나는 항상 다음과 같은 것을 사용합니다.

public static String GetTimestamp(this DateTime value)
{
    return value.ToString("yyyyMMddHHmmssfff");
}

이것은 200905211035131468과 같은 문자열을 제공합니다. 문자열이 타임 스탬프의 최상위 비트에서 최하위 순서로 이동하므로 데이터베이스에 값을 고정하는 경우 SQL 쿼리의 단순 문자열 정렬을 사용하여 날짜별로 정렬 할 수 있습니다.


5
21 개월 만 받고 12 개월 만받는 이유는 무엇입니까? :)
PaulB

2
여기서 연도의 토큰은 소문자 여야합니다. return value.ToString ( "yyyyMMddHHmmssffff");
Don Cote

1
@RobV 질문은 밀리 초 정밀도를 요구하므로 끝에 3 개의 'f'가 필요합니다. 4'f는 100 microsend 정밀도를 제공합니다.
Eugene Beresovsky

2
Compact Framework는 밀리 초를 전송하지 않습니다. 항상 0입니다. 코드를 수정하고 다음과 같이 추가해야합니다. int tick = Environment.TickCount % 1000; int ms = (tick> = MOffset)? (틱-MOffset) : (1000-(MOffset-틱)); ms = Math.Min (999, Math.Max ​​(0, ms));
Redwolf 2017-04-24

43

다음을 사용하여 초 단위로 정확한 유닉스 스타일 날짜 스탬프를 만들 수 있다고 생각합니다.

//Find unix timestamp (seconds since 01/01/1970)
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
ticks /= 10000000; //Convert windows ticks to seconds
timestamp = ticks.ToString();

분모를 조정하면 정밀도 수준을 선택할 수 있습니다.


19

길고 보편적으로 저장 가능한 DateTime.Ticks 속성을 사용할 수 있으며 항상 증가하고 컴팩트 프레임 워크에서도 사용할 수 있습니다. 9999 년 12 월 31 일 이후에 코드가 사용되지 않는지 확인하세요.)


"항상 증가"라고 말하면 DateTime.UtcNow.Ticks에 대한 두 번의 호출이 다른 값을 제공한다는 보장은 없습니다. 즉, 고유 한 타임 스탬프로 사용하기 전에 약간의주의가 필요합니다.
Jon Skeet

9
@Konstantinos : 타임 스탬프를 사용하면 중복을 피할 수 없습니다. 타임 스탬프는 고유 키에 사용되지 않고 시간을 표시하는 데 사용됩니다. 당신은 밀리 초의 정밀도가 필요하다고 말했고 틱은 100ns의 정밀도를 가지고 있습니다. 문제는 중복이 있다는 것입니다. DB에 고유 한 시퀀스가 ​​필요하지 않은 경우 안타깝게도 db에 구애받지 않습니다.
Frans Bouma

3
"시간이 지남에 따라 증가하는 실제 틱 수입니다". 그러나 시스템 시계가 뒤로 갈 수 있습니다. 예를 들어 현지 시간을 사용하는 경우 일광 절약 시간이 끝날 때 또는 시스템 시계가 조정 되었기 때문입니다.
Joe

1
@Frans : 절대적으로. 사람들이 자신이 선택한 솔루션의 의미에 대해 생각해야하기 때문에 댓글을 달았습니다. 예를 들어 적어도 DST 문제를 제거하기 위해 현지 시간이 아닌 UTC를 사용합니다.
Joe

1
@konstantinos : 흠 ... 문서는 100ns 정밀도를 가지고 있다고 말하고 있으므로 실제로 문서화 된 정밀도가 없다는 것이 이상합니다. 아마도 그것은 실제로 컴팩트 한 프레임 워크 일 것입니다. 버그가없는 프레임 워크는 아닙니다
Frans Bouma

6

당신은 또한 사용할 수 있습니다

Stopwatch.GetTimestamp (). ToString ();


4

초 단위의 타임 스탬프에 필요한 경우 다음을 사용할 수 있습니다.

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;

2

실제 실시간 시간에 해당하는 타임 스탬프를 원하지만 특정 애플리케이션 인스턴스에 대해 고유 한 타임 스탬프를 원하는 경우 다음 코드를 사용할 수 있습니다.

public class HiResDateTime
{
   private static long lastTimeStamp = DateTime.UtcNow.Ticks;
   public static long UtcNowTicks
   {
       get
       {
           long orig, newval;
           do
           {
               orig = lastTimeStamp;
               long now = DateTime.UtcNow.Ticks;
               newval = Math.Max(now, orig + 1);
           } while (Interlocked.CompareExchange
                        (ref lastTimeStamp, newval, orig) != orig);

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