2016-09-30 5 views
1

Привет всем, у меня есть небольшая проблема программирования, которая, вероятно, намного проще, чем я думаю. Поэтому мне нужно установить время для установки Timesbob ниже, чтобы быть 24 + оставшееся время до следующих 16 часов. Ниже приведен псевдокод C#, он был написан в блокноте, потому что на работе у меня нет IDE, у меня также нет большого опыта программирования с использованием дат. Я думаю, что мой алгоритм будет работать, но я думаю, что есть много способов облегчить это. Посмотрите:Как рассчитать количество часов между двумя точками в C#/Code review

//I need to make a timespan object which has 24 hours from current time + time left to the next 4pm 

//The context is time to install, which user should see 
Timespan TimeToInstall = new Timespan(23,59,59) 

//Now I am taking the current time 
Current = DateTime.Now 

//Now I add the 24 hours to the current in order to create the next day date 
Current.Add(TimeToInstall) 

//Now creating the 4 PM on the next day 
DateTime pm4 = new DateTime(Current.year,Current.month,Current.Day,16,0,0) 

//Now checking if current is above or below 4 pm 
if(Current.TimeOfDay < pm4){ 
    TimeToInstall = TimeToInstall + (pm4 - Current) 
}else if(Current.TimeOfDay > pm4){ 
    pm4.AddDays(1) 
    TimeToInstall = TimeToInstall + (pm4 - Current) 
}else { 
    //24 hours has passed and it is 4 pm so nothing to do here 
} 
+1

Советы: Вы можете использовать [C# Pad] (HTTP: // csharppad .com /) в браузере, чтобы писать фрагменты с intellisense – Martheen

+0

@Martheen Спасибо, не знал, что –

+1

Привет, Роберт ... одно замечание, которое я заметил в вашем коде. Как показывает хорошая идея Мартэйн, объекты DateTime и TimeSpan неизменяемы. На линии, где вы добавляете 24 часа: Current.Add (TimeToInstall) на самом деле не меняет Current. Он возвращает новый объект DateTime с добавленной суммой. Он должен быть Current = Current.Add (TimeToInstall). – JohnG

ответ

2

TimeSpan может быть отрицательным. Поэтому просто вычитайте TimeSpan для 4PM с текущим TimeOfDay, если вы получите отрицательное значение, добавьте 24 часа.

var timeLeft = new TimeSpan(16, 0, 0) - DateTime.Now.TimeOfDay; 
if (timeLeft.Ticks<0) 
{ 
    timeLeft = timeLeft.Add(new TimeSpan(24,0,0)) 
} 
2

на основе кода:

DateTime now = DateTime.Now; 

DateTime today4pmDateTime= new DateTime(now.Year, now.Month, now.Day, 16, 0, 0); 

//Will hold the next 4pm DateTime. 
DateTime next4pmDateTimeOccurrence = now.Hour >= 16 ? today4pmDateTime : today4pmDateTime.AddDays(1); 

//From here you can do all the calculations you need 
TimeSpan timeUntilNext4pm = next4pmDateTimeOccurrence - now; 
0

Ответ очень прост, я должен был seened это раньше. Решение этих проблем в основном является модульной арифметикой. Требованием клиента было всплывающее окно, показывающее 24 + время до следующего 16:00 (не спрашивайте, я не знаю), поэтому, если:

Программа работает в 13:00, тогда часы должны отображать 24 +3 =

, когда 16:00 она должна быть 24 + 24, 48

, когда оно 22:00 shoould будет 24 + 18, 42

Теперь я заметил, что:

13 + 27 = 40

16 + 24 = 40

22 + 18 = 40

40 Модульное 24 = 16

Поэтому в основном, если я вычесть текущее время от 40 потом будет влево с той разницей:

40 - 13 = 27

40 - 16 = 24

40 - 22 = 18

Так что я сделал это:

TimeSpan TimeToInstall;     
TimeSpan TimeGiven = new TimeSpan(23, 59, 59);   

DateTime Now = DateTime.Now; 
long TimeTo4 = (new TimeSpan(40, 0, 0).Ticks - Now.TimeOfDay.Ticks) + TimeGiven.Ticks; 
TimeToInstall = TimeSpan.FromTicks(TimeTo4); 

EDIT Выше была ловушка

ИСПРАВЛЕНО

DateTime Now = DateTime.Now; 
if (Now.Hour < 16) 
{ 
    long TimeTo4 = (new TimeSpan(40, 0, 0).Ticks - Now.TimeOfDay.Ticks); 
    TimeToInstall = TimeSpan.FromTicks(TimeTo4); 
} 
else 
{ 

    long TimeTo4 = (new TimeSpan(40, 0, 0).Ticks - Now.TimeOfDay.Ticks) + TimeGiven.Ticks; 
    TimeToInstall = TimeSpan.FromTicks(TimeTo4); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^