2013-06-29 1 views
2

정말 간단하다고 느끼지만, Google 푸는 차이 계산을 계속해서 알려주고 있습니다.다음 번에 나타날 때까지의 시간을 밀리 초로 계산하십시오.

DateTime 개체에 저장된 시간 (예 : 1800 시간)입니다. 날짜는 null이며 중요하지 않습니다. 내가 알고 싶은 것은 그 시간의 NEXT가 발생할 때까지 얼마나 많은 밀리 세컨드인지입니다.

따라서 계산을 0600에서 실행하면 12 시간 (ms)이 반환됩니다. 1750 년에 10 분 (ms)이 반환되고 1900 년에는 24 시간 (ms)이 반환됩니다.

내가 찾을 수있는 모든 것들은 차이를 계산하는 방법을 보여 주며, 일단 당신이 과거를 지나면 효과가 없습니다. 여기

내가 뭘하려하지만 시간이 지나서 한 번 실패하고 음의 값을 제공 : 부정적인 결과를 처리 : 이미 한 가지를 제외하고 당신이해야 모든 것을하고있는

DateTime nowTime = DateTime.Now; 
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay; 
double result = difference.TotalMilliseconds; 
+2

['TimeSpan.TotalMilliseconds' 속성] (http://msdn.microsoft.com/en-us/library/system.timespan.totalmilliseconds.aspx) –

+1

BTW, 자정이 될 수 있고 해당 날짜에 예정된 DST 변경이있을 수 있으므로 날짜가 * null *이 아니며 중요하지 않습니다. – Jon

+0

"작동하지 않는다"고 할 때, 그 뜻은 무엇입니까? 차이를 계산하는 방법을 보여주는 코드를 발견했다고 말하면 코드를 표시 할 수 있습니까? –

답변

4

.

결과가 음수이면, 을 계산 한 후이 이미 경과 할 때를 의미하며, 그 다음에 "내일"을 의미하고 양수 값을 얻길 원합니다. 시간이 19:00 시간 때까지 시간을 계산하려면, 현재 시간 입니다 :

DateTime nowTime = DateTime.Now; 
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay; 
double result = difference.TotalMilliseconds; 
if (result < 0) 
    result += TimeSpan.FromHours(24).TotalMilliseconds; 

고려해야 할 다음 일은 이것이다 :이 경우

, 단순히 24 시간 추가 정확히
19:00시, 0 또는 24 시간 분량을 반환 하시겠습니까? 의미가, 당신은 정말로 다음번 그런 사건을 원합니까?

그렇다면, <=를 사용하는 위의 if -statement 변경하는 경우 :

DateTime nowTime = DateTime.Now; 
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay; 
double result = difference.TotalMilliseconds; 
if (result <= 0) 
    result += TimeSpan.FromHours(24).TotalMilliseconds; 

그러나,이 부동 소수점 값을 사용하여 일반적인 문제에 대한 경향이있을 것이라는 점을주의한다. 현재 시간이 18 : 59 : 59.9999999 인 경우, 현재 시간 (아주 작은 부분)을 오늘 19 시까 지 반환하거나, 내일에 반전시키고 싶습니까? 그렇다면, 약간 다른 것으로 비교를 변경합니다

DateTime nowTime = DateTime.Now; 
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay; 
double result = difference.TotalMilliseconds; 
if (result <= -0.0001) 
    result += TimeSpan.FromHours(24).TotalMilliseconds; 

-0.0001는 "당신은 준비가있어 부정확의 범위가 밀리 세컨드의 측면에서 내일 대신 오늘의 인 수용에 해당하는 값이다 ".

+0

환상적입니다.이 시간을 내 주셔서 감사합니다. – Dan

+0

DST로 인해이 접근법이 항상 올바르지는 않습니다. 일반적으로, 당신이'DateTime'에 고정 timespans를 추가 할 때마다 당신은 DST 버그를 작성하고 있습니다. – Jon

+0

그는 구체적으로 시간을 다루기 때문에, 그것은 논쟁 거리가 아니라고 말할 것입니다. 그러나 당신이 날짜를 포함한다면 당연히 맞습니다. 또한 내가 실제로 DateTime에 고정 timespans를 추가하는 것이 아니라, 다른 TimeSpan을 추가하는 것입니다. 그러나 그것은 의미 론적 문제입니다. 여기서 당신의 코멘트에 관한 문제는 * 빼기 기호입니다. –

2

이렇게 계산할 때는 가능한 DST 변경 사항을 고려하여 결과가 올바른지 확인하는 것이 중요합니다.

var shutdownTime = TimeSpan.FromHours(18); 
// just to illustrate, in Europe there is a DST change on 2013-10-27 
// normally you 'd just use DateTime.Now here 
var now = new DateTime(2013, 10, 26, 20, 00, 00); 

// do your calculations in local time 
var nextShutdown = now.Date + shutdownTime; 
if (nextShutdown < now) { 
    nextShutdown = nextShutdown.AddDays(1); 
} 

// when you want to calculate time spans in absolute time 
// (vs. wall clock time) always convert to UTC first 
var remaining = nextShutdown.ToUniversalTime() - now.ToUniversalTime(); 
Console.WriteLine(remaining); 

귀하의 질문에 대한 대답은 지금 remaining.TotalMilliseconds 다음과 같습니다

은 작동 매개 변수는 가정하자.

+0

감사합니다. 이것은 내 목적 (유명한 마지막 단어)에 중요하지 않지만 알아두면 좋을 것입니다. – Dan

관련 문제