2012-08-26 2 views
0

에포크 시간과 DateTime.UtcNow 사이의 밀리 초를 반환하는 간단한 방법을 쓰면 적절한 대답을 얻습니다. 그러나 임의의 날짜와 시간 사이에 밀리 초를 반환하는 메서드를 작성하면 마지막 세 자리는 항상 0입니다. 'Some arbitrary date'는 메서드에 DateTime.Parse ("임의의 날짜 문자열")의 결과를 전달한다는 의미입니다. 필자가 알아낼 수있는 한 가까이에서 .Parse에 의해 반환 된 DateTime 객체는 모든 유효 자릿수를 반환하지 않습니다.임의의 날짜와 에포크 시간 사이의 밀리 초가 걸리는 시간

시험 방법 :

static void GetMillis() 
     { 
      DateTime dUtc = DateTime.UtcNow; 
      DateTime epoch = new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc); 
      double utcmillis = (dUtc - epoch).TotalMilliseconds; 
      String timestamp = dUtc.ToString(); 
      DateTime arbitrary = (DateTime.Parse(timestamp)); 
      Console.WriteLine("Milliseconds between DateTime.UtcNow {0} \nand epoch time {1} are {2}", dUtc, epoch, utcmillis); 
      Console.WriteLine("Milliseconds between arbitrary date {0} \nand epoch time {1} are {2}", arbitrary, epoch, (arbitrary - epoch).TotalMilliseconds); 
     } 

출력 : 나는 우스꽝 뭔가 잘못하고 또는 여기에 수학을 이해하지 못하는거야 경우 나도 몰라

C:\src\vs\epochConverter\epochConverter\bin\Debug 
{powem} [54] --> .\epochConverter.exe -debug 
Milliseconds between DateTime.UtcNow 8/26/2012 11:12:31 PM 
and epoch time 1/1/1970 12:00:00 AM are 1346022751385.8 
Milliseconds between arbitrary date 8/26/2012 11:12:31 PM 
and epoch time 1/1/1970 12:00:00 AM are 1346022751000 

. 나는 MSDN에서 조사한 결과이 차이점과 관련된 것을 찾을 수 없다. 설명 된대로 밀리를 계산할 수 있기를 정말로 원합니다 - 가능합니까?

감사합니다.

MP

답변

2

당신은의 중간 값을 검사 할 :

String timestamp = dUtc.ToString(); 

그것은 당신의 로컬 설정에 따라 달라집니다 반환하지만 가장 가까운 초 만 정확 8/26/2012 11:12:31 같은 것을,있을거야 그냥 무엇을.

당연히 파싱은 0 밀리 초로 날짜 시간을 제공합니다.

따라서 에포크 (Episch) 이후 방법의 밀리 초가 해당 지점에 0을 포함하는 것이 맞습니다.

이 같은 짓 그러나 경우

arbitrary = new DateTime(2012, 8, 26, 11, 12, 31, 123); 

을 당신은 결과에 영향을 미치는 그 123 밀리 초를 얻을 것입니다. ToStringParseExact을 사용할 수도 있는데, 여기에는 초 단위의 분수 또는 전체 DateTime을 얻는 다른 방법이 포함됩니다.

에포크가 완벽하게 작동했으나 테스트하기위한 날짜를 얻는 방법에 결함이있었습니다.

+0

자세한 답변을 보내 주셔서 감사합니다.나는 도전이 결함이 있다고 생각한다. 왜냐하면 나는 두 개의 날짜 사이에 밀리 세컨드 _ 차이를 원하기 때문에 주어진 날짜는 밀리 세컨드 수로 나타낼 수 있어야합니다. 그러나 DateTime 수학에서 실제로 그런 일이 발생하지는 않습니다. 사용 사례는 시연 된 형식의 날짜 문자열이 DateTime 개체로 변환 된 다음 처리되도록하는 것입니다. MSDN 기사, "방법 : 날짜와 시간 값에 밀리 초 표시"를 살펴 봤지만 그 일을 저에게 할 수 없었습니다. – naugiedoggie

+0

유즈 케이스에서 문자열을 구문 분석해야하는 경우 끝에 '000'을 입력하면됩니다. 1970 년 이래로 일부 시스템에서 날짜에 대한 일반적인 내부 표현 인 밀리 초로 인한 것일 수 있습니다. –

+0

그것에 대해 생각한 후에 나는 날짜 계산이 계산 될 때 실제로 일어나는 일을 더 잘 이해했다고 믿습니다. 나는 _epoch time_에서 값을 만들어내는 도구를 가지고 있지만 몇 시간은 밀리 초 단위로, 몇 초 만에 분출하게됩니다. 이것은 분명히 버그이지만 그것은 나에게 블랙 박스입니다. 이 모든 질문의 끝은 이러한 차이를 계산하기위한 가장 간단한 도구를 만드는 것입니다. 나는 그들이 어떻게 일하는지 이해하지 못하는 일을 좋아하지 않는다. ;-) – naugiedoggie

1

DateTime.ToString() 형식 밀리 초와 데이터가 손실되는 곳은 포함되어 있지 않습니다 기본; 전에Parse 전에 발생합니다. 이하 입력

DateTime.UtcNow.ToString() 
// -> 8/26/2012 11:37:24 PM 
DateTime.Parse("8/26/2012 11:37:24 PM").Millisecond 
// -> 0 

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffK") 
// -> 2012-08-26T23:41:17.3085938Z 
DateTime.Parse("2012-08-26T23:41:17.3085938Z").Millisecond 
// -> 308 

The Round-trip ("O", "o") Format Specifier 를 참조하십시오 문자열 표현의 밀리 초를 얻으려면, 사용자 정의 형식을 사용합니다. 또는이 경우 변환을 완전히 피하는 것을 고려하십시오.

수학은 소리입니다.

0

여기서 수학은 합리적입니다. 1 초 안에 1000 밀리 초가 있다는 것을 잊지 마십시오. 밀리 초를 포함하지 않는 임의의 시간과 밀리 초를 포함하는 거의 동일한 시간의 모든 날짜 계산은 +/- 1000 밀리 초의 오류를 갖습니다.