DateTime: Set Target Hour goes to next day error

Hi if i set a target date/time at say 8pm and want a target of 5hrs. i get errors in my code to say the target date/time is out of range. I’m guessing it’s because the hour goes over 24hrs in a day. How would i fix this? Thanx

my code:

DateTime target = new DateTime (HourlyYear, HourlyMonth, HourlyDay, HourlyHour + HourlyRewardHour, HourlyMin + HourlyRewardMinute, HourlySec + HourlyRewardSecond);
						DateTime now = DateTime.Now;

						int targetSec = target.Hour * 3600 + target.Minute * 60 + target.Second;
						int nowSec = now.Hour * 3600 + now.Minute * 60 + now.Second;

						int diff = targetSec - nowSec;

						int NewHour = diff / 3600;
						int NewMin = (diff % 3600) / 60;
						int NewSec = (diff % 3600) % 60;

DateTime target = new DateTime(2018, 1, 13, 4, 53, 23);
DateTime now = DateTime.Now;

TimeSpan remainingTime = target.Subtract(now);

Here you will have the remaining Time if target > now.

If you want the Time that will be in a specified hour time then use:

TimeSpan target = new TimeSpan(23, 0, 0);

DateTime targetDateTime = DateTime.Now + target;

And targetDateTime will also contain dates that are tomorrow or in a week or year.
So if it is 13.01.2018 02:00:00, targetDateTime will be that plus 23 hours: 14.01.2018 01:00:00

Basically it’s an Hourly Reward Bonus! and set’s the target time from when the user starts first time to once collected the reward the timer will set a 4 hour timer from the current time.

FIRST I SET THE TARGET TIME AND SAVE!

if (PlayerPrefs.HasKey ("Hourly_Year")) {
				HourlyYear = PlayerPrefs.GetInt ("Hourly_Year");
			}
			else {
				HourlyYear = DateTime.Now.Year;
				PlayerPrefs.SetInt ("Hourly_Year", HourlyYear);
			}

			if (PlayerPrefs.HasKey ("Hourly_Month"))
				HourlyMonth = PlayerPrefs.GetInt ("Hourly_Month");
			else {
				HourlyMonth = DateTime.Now.Month;
				PlayerPrefs.SetInt ("Hourly_Month", HourlyMonth);
			}

			if (PlayerPrefs.HasKey ("Hourly_Day"))
				HourlyDay = PlayerPrefs.GetInt ("Hourly_Day");
			else {
				HourlyDay = DateTime.Now.Day;
				PlayerPrefs.SetInt ("Hourly_Day", HourlyDay);
			}

			if (PlayerPrefs.HasKey ("Hourly_Hour"))
				HourlyHour = PlayerPrefs.GetInt ("Hourly_Hour");
			else {
				HourlyHour = DateTime.Now.Hour;
				PlayerPrefs.SetInt ("Hourly_Hour", HourlyHour);
			}

			if (PlayerPrefs.HasKey ("Hourly_Min"))
				HourlyMin = PlayerPrefs.GetInt ("Hourly_Min");
			else {
				HourlyMin = DateTime.Now.Minute;
				PlayerPrefs.SetInt ("Hourly_Min", HourlyMin);
			}

			if (PlayerPrefs.HasKey ("Hourly_Sec"))
				HourlySec = PlayerPrefs.GetInt ("Hourly_Sec");
			else {
				HourlySec = DateTime.Now.Minute;
				PlayerPrefs.SetInt ("Hourly_Sec", HourlySec);
			}

THEN THIS WILL UPDATE AND CALCULATE THE TIME REMAINING!

DateTime target = new DateTime (HourlyYear, HourlyMonth, HourlyDay, HourlyHour + HourlyRewardHour, HourlyMin + HourlyRewardMinute, HourlySec + HourlyRewardSecond);
						DateTime now = DateTime.Now;

						TimeSpan remainingTime = target.Subtract (now);

THEN I CHECK TO SEE OF THE TIMERS HAVE REACHED 0!

if (remainingTime.Hours <= 0 && remainingTime.Minutes <= 0 && remainingTime.Seconds <= 0) {
								RewardMan.HourlyRewardTimeText.text = "CLAIM BONUS!";
								RewardMan.ClaimHourlyButton.interactable = true;
							} else {
								RewardMan.HourlyRewardTimeText.text = remainingTime.Hours.ToString () + " HOURS, " + remainingTime.Minutes.ToString () + " MINS & " + remainingTime.Seconds.ToString () + " SECS!";
								RewardMan.ClaimHourlyButton.interactable = false;
							}

THIS IS CALLED ONCE THE USER HAS PRESSED THE BUTTON, IT WILL SET A NEW TARGET TIME FROM 4 HOURS FROM NOW!

//Clear Saves and save fresh, to avoid any errors!
			if (PlayerPrefs.HasKey ("Hourly_Year"))
				PlayerPrefs.DeleteKey ("Hourly_Year");
			if (PlayerPrefs.HasKey ("Hourly_Month"))
				PlayerPrefs.DeleteKey ("Hourly_Month");
			if (PlayerPrefs.HasKey ("Hourly_Day"))
				PlayerPrefs.DeleteKey ("Hourly_Day");
			if (PlayerPrefs.HasKey ("Hourly_Hour"))
				PlayerPrefs.DeleteKey ("Hourly_Hour");
			if (PlayerPrefs.HasKey ("Hourly_Min"))
				PlayerPrefs.DeleteKey ("Hourly_Min");
			if (PlayerPrefs.HasKey ("Hourly_Sec"))
				PlayerPrefs.DeleteKey ("Hourly_Sec");
				
			
			//SAVE NEW COLLECTED TIME!
			HourlyYear = DateTime.Now.Year;
			PlayerPrefs.SetInt ("Hourly_Year", HourlyYear);

			HourlyMonth = DateTime.Now.Month;
			PlayerPrefs.SetInt ("Hourly_Month", HourlyMonth);

			HourlyDay = DateTime.Now.Day;
			PlayerPrefs.SetInt ("Hourly_Day", HourlyDay);

			HourlyHour = DateTime.Now.Hour;
			PlayerPrefs.SetInt ("Hourly_Hour", HourlyHour);
			 
			HourlyMin = DateTime.Now.Minute;
			PlayerPrefs.SetInt ("Hourly_Min", HourlyMin);

			HourlySec = DateTime.Now.Minute;
			PlayerPrefs.SetInt ("Hourly_Sec", HourlySec);

			//Give Reward Item! You can specify a Reward Item by setting the element ID and set true to false, Current settings are set for Random Item from Achievement Reward Item's List!
			if (RewardMan != null)
				RewardMan.GiveHourlyRewardItem (HourlyRewardID);

THANK YOU FOR YOUR HELP!