Datetime UTC/GMT time to local time "where I am" - c#

Let's say that I have this DateTime(Mar/01/2015 09:55:52)
I want to know if that time (I think this time is from Germany, anyways, I'm living in Brazil and the difference between us is 4hours).
So basically:
DateTime I have: Mar/01/2015 09:55:52
DateTime.Now That representes "where I am": Mar/01/2015 05:55:52
I want to make this parse to tell me, for example, if that "DateTime that I have" is 1 minutes after at least and 10 minuts later at maximum from the "DateTime where I am".

If you are on .net 4.5 - you can use the TimeZoneInfo class, it has a ConvertTime method that lets you pass in a datetime and a timezone
TimeZoneInfo.ConvertTime Method (DateTime, TimeZoneInfo)
you can use it like:
DateTime dateTimeIhave = TimeZoneInfo.ConvertTime(dateTheyGave, theirTimeZone, yourTimeZone);
if (dateTimeIhave > DateTime.Now.AddMinutes(1)
&& dateTimeIhave < DateTime.Now.AddMinutes(10))
{
doSomething();
}

//pseudocode
//DateTime that represents where you're at = dnow;
//DateTime that you have = dhave;
//convert dnow and dhave to seconds using this algorithm:
//convert the time into a string and get the data using a parser.
//int seconds = current seconds;
//seconds += minutes * 60;
//seconds += hours * 60 * 60;
Then find out if both times are between 60 seconds and 600 seconds from each other.

Related

Compare two DateTimes with ignoring seconds and milliseconds

I take two object from database. One is a filename with date init and second one is a DateTime object like 2021-08-08 17:32:07.880.
First, I converted filename to datetime with the code shown here:
var fileDate = DateTime.ParseExact(filename, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
I have to check that the difference between the first date and the second date is 3 hours 15 min or simply 3 hours.
How do I delete seconds and milliseconds of date 2, and compare them?
I'd go similar to MatJ's recommendation:
You've got your file time, and your DB time, which might have seconds and milliseconds on it. If you do the later one minus the earlier one you get a timespan representing the length of time between the datetimes
dBDate - fileDate
Timespans have a TotalMinutes property that is a decimal. A timespan of 5 minutes 45 seconds would have a TotalMinutes of 5.75
So, if we cast that to an int it cuts off the seconds; simples!
var t = (int)((dBDate - fileDate).TotalMinutes);
Now you can compare your t for equality to 180 (3h) or 195 (3h15h
It is very easy to do !
Try following code :
TimeSpan timeSpan = (firstDate - secondDate)
timeSpan.CompareTo(new TimeSpan(3, 15, 0)) // hrs, mins, seconds
This CompareTo method will return 1 if difference between two times is greater than 3 hrs and 15 mins, otherwise, it will return -1
PS:
firstDate and secondDate are in DateTime

Problem with time intervals with given start time and end time c#

I am trying to develop a simple app for my upskill for c#, however I am stuck and new to the functionality of time with c#,
what I need:
I have a 3 text boxes that will contain start time, end time and time interval.
say user entered 7:00 AM , 12:00 PM , and 60 minutes it will store it inside a datatable and add it inside a listbox.
7:00 AM
8:00 AM
9:00 AM
10:00 AM
11:00 AM
12:00 AM
current approach:
I think I need to use the DateTime.AddMinutes(interval) but how am I going to arrive to the logic of it will stop if it reaches the end time? using the DateTime method? I am really confused on what to use, I saw TimeRange, TimeSpan etc.
You can use TimeSpan and DateTime together (to calculate and print respectively)
TimeSpan start = DateTime.Parse("7:00 AM").TimeOfDay;
TimeSpan end = DateTime.Parse("12:00 PM").TimeOfDay;
TimeSpan interval = new TimeSpan(0, 60, 0);
// If Start is bigger than end, Add a day to the end.
if (start > end)
end = end.Add(new TimeSpan(1, 0, 0, 0));
while (true)
{
Console.WriteLine((new DateTime() + start).ToString("hh:mm tt"));
start = start.Add(interval);
if (start > end)
break;
}
Output looks like this,
07:00 AM
08:00 AM
09:00 AM
10:00 AM
11:00 AM
12:00 PM
MS Documentation on TimeSpan
You can use TimeSpan with boolean logical operator to test if the currentTime is less than your endTime.
Below is example code.
TimeSpan startTime;
int interval;
TimeSpan tInterval = new TimeSpan(interval, 0, 0);
TimeSpan endTime;
TimeSpan currentTime = startTime;
while( (currentTime = startTime + tInterval) <= endTime)
{
// add currentTime to list box
}
This should take care of the issue with the End Times being "earlier" than the Start Time:
private static void TestTimeSpan()
{
int minutes = 60;
var interval = new TimeSpan(0,minutes,0);
TimeSpan start = DateTime.Parse("7:00 PM").TimeOfDay;
TimeSpan end = DateTime.Parse("1:00 AM").TimeOfDay;
//End of input data--start of solution
var diffSpan = end - start;
var diffMinutes = diffSpan.TotalMinutes > 0 ? diffSpan.TotalMinutes : diffSpan.TotalMinutes + (60 * 24);
var myTimeList = new List<TimeSpan>();
for(int i = 0; i < diffMinutes + minutes; i += minutes)
{
myTimeList.Add(start);
start = start.Add(interval);
}
myTimeList.ForEach(x => Console.WriteLine((new DateTime() + x).ToString("hh:mm tt")));
}
EDIT
Creating a sequence of Time values based in two input times and an interval is straight forward until the "start time" is earlier than the "end time", because just checking to see if the "end time" is greater than the start time fails your algorithm immediately.
This code utilizes the fact that there are only 24 hours in the day. Since the interval value is given in minutes, we can use that to section those minutes into "steps" of time. This code proceeds to step through each interval in time and capture the time at that step and save that in a List of TimeSpan (the captured value could easily be of type string--formatted as desired).
The trick here is when the "end time" is earlier than the "start time" we get a negative TimeSpan which is then used to calculate the steps to the "end time" on the next day. This is where the (60 * 24) [60 minutes x 24 hrs] part comes in to create the correct "diffMinutes" using a ternary operator.
After that the code simple iterates over the List "myTimeList" to write the formatted TimeSpan to the console. However, this 'List' is just a portable collection that can be sent anywhere in you code to do anything needed.
There are lots of other solutions, this one just seems straightforward, to me.

Subtracting timespan from 24 hours

I'm trying to subtract my potentially negative timespan values from 24 hours to change them into positive values.
As an example case:
I want to find how much time is there till 8:00 AM.
If it's 16:00 PM now, timespan gives me -8 ish value so I want to substract it from 24 to get 16.
I'm trying this but it's giving me this error
The DateTime represented by the string is not supported in calendar
System.Globalization.GregorianCalendar.
What I tried ;
string startTime = String.Format("{0:t}", "8:00");
TimeSpan timeLeft = Convert.ToDateTime(startTime).Subtract(DateTime.Now);
if (timeLeft.TotalMinutes < 0 )
{
timeLeft = Convert.ToDateTime(String.Format("{0:H}","24:00")).Subtract(Convert.ToDateTime(timeLeft.Negate())) ;
}
How can I achieve subtracting my potentially negative timespans from 24 hours?
You are confusing TimeSpan and DateTime. I guess there is an easier way:
var eightOClock = TimeSpan.FromHours(8);
var now = DateTime.Now;
var till8again = now.TimeOfDay > eightOClock
? TimeSpan.FromHours(32) - now.TimeOfDay
: eightOClock - now.TimeOfDay;
So if TimeOfDay is less than eight hours (it's before 8am), we take the difference to 8am. If it's greater than 8am, we take the difference to 32hours, which is 8am tomorrow.
A DateTime is an absolute date, happening at a certain day, month, year... It must not be used to represent a specific hour.
So your attempt to convert "8:00", or "24:00" in a DateTime will forcibly fail.
For this you must use TimeSpan (or eventually an integer if you always work with hours).
You can use for example
if(DateTime.Now.TimeOfDay > TimeSpan.FromHours(8))
To see if it's more or less than 8:00.
TimeOfDay will return you the amount of time elapsed for today since midnight.
DateTime has also a lot of useful methods to Add or Substract time, see https://msdn.microsoft.com/fr-fr/library/system.datetime(v=vs.110).aspx for details
Use TimeSpan, and if the startDate is less the Now, add a day to it and then make the comparison.
TimeSpan startTime = new TimeSpan(8,0,0);
TimeSpan now = DateTime.Now.TimeOfDay;
startTime = startTime < now ? startTime.Add(TimeSpan.FromDays(1)) : startTime;
TimeSpan diff = startTime - now;
Another point: the error is coming from the fact that 24:00 doesn't represent 12:00 midnight. 0:00 represents midnight, and that will be a valid DateTime.

Minute give wrong values on substract

I want to subtract minutes and get the difference. below is my code
double diff = currBlock.EndTime.Subtract(currBlock.StartTime).TotalMinutes;
In given code (currBlock.StartTime = 23:30:00) and (currBlock.EndTime= 00:20:00)
here starttime is time of today i.e.(09/26/2016 23:30:00), night time which will be consider as 11:30 PM and endtime is time of tomorrow i.e.(09/27/2016 00:20:00), morning time which will be consider as 12:20 Am. In my code i am getting values in minus which is -1390 and it is incorrect. So please help me to solve this.
Here i have attach image of data for further reference.
please explain me properly, how do i use it? it is just a time block for different shift so there is no date include in it
There is a date included in it. You're telling us that EndTime is something like 09/27/2016 00:20:00, while StartTime is something like 09/26/2016 23:30:00. The problem is that that knowledge is in your head and not in your code. If you subtract the values as TimeSpans, then you're literally saying: what is 30 minutes minus 23 hours and 30 minutes. The answer, of course is -23 hours. To get the real difference, you must include the dates, which means utilizing a DateTime or DateTimeOffset type for both StartTime and EndTime, so you can encode that whole date and time. Then, when you do the subtraction, it will return the right value.
Below Code works for me. Thanks friends for your support and help.
string strCurrDate = (DateTime.Now.Date + currBlock.EndTime).ToString();
DateTime dtYourDate = DateTime.Parse((DateTime.Now.AddDays(-1).Date + currBlock.StartTime).ToString());
string strYourDate = dtYourDate.ToShortDateString() + " " + dtYourDate.ToLongTimeString();
string strTotalMinsElapsed = TotalMinutesElapsed(dtYourDate).ToString();
private long TotalMinutesElapsed(DateTime dtYourDate)
{
long lTotalMinutesElapsed = 0;
//Find Current Date and Time
DateTime dtCurrent = DateTime.Now;
//Find Time Difference details between current date and your given date
TimeSpan tsDiff = dtCurrent.Subtract(dtYourDate);
//Add Total Minutes for Days difference
lTotalMinutesElapsed = lTotalMinutesElapsed + tsDiff.Days * (24 * 60);
//Add Total Minutes for Hour difference
lTotalMinutesElapsed = lTotalMinutesElapsed + tsDiff.Hours * 60;
//Add Minutes
lTotalMinutesElapsed = lTotalMinutesElapsed + tsDiff.Minutes;
return lTotalMinutesElapsed;
}

Time Math Guidance needed

I have a DateTime object that is 10:00 AM
This time represents what time of day a report should be run.
I want to calculate the amount of time remaining from NOW until 10:00 AM
part of my confusion is NOW might be after 10:am or BEFORE 10am,
I keep playing around with TimeSpan, but my results are not quite right... I am sure this is simple, but it is one of those things I have been working of for a few hours and I need a push in the right direction...
I want the timespan object timeTillRun to be correct...here is what I have tried:
{
DateTime scheduledRun = DateTime.Today.AddHours(_timeToStart);//_timeToStart = 10
TimeSpan timeTillRun = DateTime.Now - scheduledRun;
}
This will work... but you need to reverse the order of subtraction:
TimeSpan timeTillRun = scheduledRun - DateTime.Now;
Note that if it's currently after 10AM, timeTillRun will be negative. You will presumably also need to check if the current time is on or after 10AM, then add 10 hours and one day to DateTime.Today to obtain the next run time. Alternatively, you could test if timeTillRun is negative; if so, just add one day to it (timeTillRun += new TimeSpan(1, 0, 0, 0)).
Try this
DateTime timeToStart = DateTime.Today.AddHours(10);
TimeSpan timeTillRun;
// Checking to see if current time is passed schedule run, if it is then we add a day (this is assuming this is run daily, if days are skipped like weekends for example then this would need some tweaking)
if (DateTime.Now > timeToStart)
timeTillRun = DateTime.Now.AddDays(1.0) - timeToStart;
else
timeTillRun = DateTime.Today - timeToStart;
double totalHoursRemaining = timeTillRun.TotalHours; // get total hours remaining
string prettyRemaining = String.Format("{0} day and {1} hours", timeTillRun.Days, timeTillRun.Hours); // can do some outputting here

Categories