Subtracting two dates - c#

I have two calendars and each return a DateTime from calendar.SelectedDate.
How do I go about subtracting the two selected dates from each other, giving me the amount of days between the two selections?
There is a calendar.Subtract() but it needs a TimeSpan instead of DateTime.

You can use someDateTime.Subtract(otherDateTime), this returns a TimeSpan which has a TotalDays property.

Just use:
TimeSpan difference = end - start;
double days = difference.TotalDays;
Note that if you want to treat them as dates you should probably use
TimeSpan difference = end.Date - start.Date;
int days = (int) difference.TotalDays;
That way you won't get different results depending on the times.
(You can use the Subtract method instead of the - operator if you want, but personally I find it clearer to use the operator.)

Think about it.
How do you express a difference betwen two dates? With another date?
That's why you need the TimeSpan
DateTime dtToday = new System.DateTime(2012, 6, 2, 0, 0, 0);
DateTime dtMonthBefore = new System.DateTime(2012, 5, 2, 0, 0, 0);
TimeSpan diffResult = dtToday.Subtract(dtMonthBefore);
Console.WriteLine(diffResult.TotalDays);

Related

How can I convert the number of seconds since Jan 1st 1970 into a datetime value?

I have a number that is the number of seconds since January 1st 1970. It was created with this:
var utcNow = (int) Math.Truncate(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds);
Now need to convert that number to a date in string form like this:
Tue, Jan 15, 2019
Can someone give me some suggestions on how I can do this. I think I can format it myself but I need a suggestion on how to convert the integer utcNow into a datetime first.
static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
...
DateTime time = epoch.AddSeconds(utcNow);
You can also use this in reverse:
var seconds = (time - epoch).TotalSeconds;
(which gives a double, but you can cast it to int or long etc)
Some answer are already given, and work. But this is, I believe, the most elegant way of doing it. I'm using DateTimeOffset.FromUnixTimeSeconds(int64)
DateTimeOffset dt = DateTimeOffset.FromUnixTimeSeconds(utcNow);
And now you can convert it into a DateTime Struct with help of this blog entry
Substract the given time from current time and it gives timespan instance, from that you can get total seconds
var fromDate = new DateTime(1970,1 ,1);
var diffrance = DateTime.UtcNow.Subtract(fromDate);
Console.WriteLine(diffrance.TotalSeconds);

How many days belong to a certain range of dates?

Let's say I have a start DateTime object containing 2012/09/21 23:59:59 and an end DateTime object containing 2012/09/22 00:01:02. The difference between these two objects is little more than a minute, but the number of days belonging to this range of dates is equal to 2.
I have read other similar questions, and I think that TimeSpan and DateTime classes do not provide methods to perform this type of calculation. How to calculate the number of days belonging to a certain range of dates?
Use:
DateTime dateTime1 = DateTime.Parse("2012/09/21 23:59:59");
DateTime dateTime2 = DateTime.Parse("2012/09/22 00:01:02");
TimeSpan difference = dateTime1 - dateTime2;
The variable difference contains the time between the two dates. For example use the TotalDays property to get the difference in days.
If you want to exclude the time portion, use the Date property on DateTime, for example:
TimeSpan difference = dateTime1.Date - dateTime2.Date;
TotalDays will be 1 in this case rather than 0.
You can do the following:
System.DateTime dtTodayNoon = new System.DateTime(2006, 9, 13, 12, 0, 0);
System.DateTime dtTodayMidnight = new System.DateTime(2006, 9, 13, 0, 0, 0);
System.TimeSpan diffResult = dtTodayNoon.Subtract(dtYestMidnight);
Console.WriteLine("Yesterday Midnight - Today Noon = " + diffResult.Days);
Console.WriteLine("Yesterday Midnight - Today Noon = " + diffResult.TotalDays);
Console.ReadLine();
If you want to include the daylight savings:
System.TimeSpan diffResult = dtTodayNoon.ToUniversalTime().Subtract(dtYestMidnight.ToUniversalTime());
You could use DateTimeOffSet too if timezones are important
Doesn't
(dateTime2 - dateTime1).TotalDays
work for you?
I have read other similar questions, and I think that TimeSpan and
DateTime classes do not provide methods to perform this type of
calculation.
Of course that they do.
TimeSpan is the class to use. I guess you are looking for the TotalDays property, aren't you?
DateTime date1 = ...;
DateTime date2 = ...;
TimeSpan difference = date2 - date1;
int totalNumberOfDays = difference.TotalDays;

TimeSpan to DateTime conversion

I want to convert a Timespan to Datetime. How can I do this?
I found one method on Google:
DateTime dt;
TimeSpan ts="XXX";
//We can covnert 'ts' to 'dt' like this:
dt= Convert.ToDateTime(ts.ToString());
Is there any other way to do this?
It is not very logical to convert TimeSpan to DateTime. Try to understand what leppie said above. TimeSpan is a duration say 6 Days 5 Hours 40 minutes. It is not a Date. If I say 6 Days; Can you deduce a Date from it? The answer is NO unless you have a REFERENCE Date.
So if you want to convert TimeSpan to DateTime you need a reference date. 6 Days & 5 Hours from when? So you can write something like this:
DateTime dt = new DateTime(2012, 01, 01);
TimeSpan ts = new TimeSpan(1, 0, 0, 0, 0);
dt = dt + ts;
While the selected answer is strictly correct, I believe I understand what the OP is trying to get at here as I had a similar issue.
I had a TimeSpan which I wished to display in a grid control (as just hh:mm) but the grid didn't appear to understand TimeSpan, only DateTime . The OP has a similar scenario where only the TimeSpan is the relevant part but didn't consider the necessity of adding the DateTime reference point.
So, as indicated above, I simply added DateTime.MinValue (though any date will do) which is subsequently ignored by the grid when it renders the timespan as a time portion of the resulting date.
TimeSpan can be added to a fresh DateTime to achieve this.
TimeSpan ts="XXX";
DateTime dt = new DateTime() + ts;
But as mentioned before, it is not strictly logical without a valid start date. I have encountered
a use-case where i required only the time aspect. will work fine as long as the logic is correct.
You need a reference date for this to be useful.
An example from
http://msdn.microsoft.com/en-us/library/system.datetime.add.aspx
// Calculate what day of the week is 36 days from this instant.
System.DateTime today = System.DateTime.Now;
System.TimeSpan duration = new System.TimeSpan(36, 0, 0, 0);
System.DateTime answer = today.Add(duration);
System.Console.WriteLine("{0:dddd}", answer);
Worked for me.
var StartTime = new DateTime(item.StartTime.Ticks);
If you only need to show time value in a datagrid or label similar, best way is convert directly time in datetime datatype.
SELECT CONVERT(datetime,myTimeField) as myTimeField FROM Table1
You could also use DateTime.FromFileTime(finishTime) where finishTme is a long containing the ticks of a time. Or FromFileTimeUtc.
An easy method, use ticks:
new DateTime((DateTime.Now - DateTime.Now.AddHours(-1.55)).Ticks).ToString("HH:mm:ss:fff")
This function will give you a date (Without Day / Month / Year)
A problem with all of the above is that the conversion returns the incorrect number of days as specified in the TimeSpan.
Using the above, the below returns 3 and not 2.
Ideas on how to preserve the 2 days in the TimeSpan arguments and return them as the DateTime day?
public void should_return_totaldays()
{
_ts = new TimeSpan(2, 1, 30, 10);
var format = "dd";
var returnedVal = _ts.ToString(format);
Assert.That(returnedVal, Is.EqualTo("2")); //returns 3 not 2
}
First, convert the timespan to a string, then to DateTime, then back to a string:
Convert.ToDateTime(timespan.SelectedTime.ToString()).ToShortTimeString();

Exact c# result of sql datediff

I'm trying to get the number of days (calculated byu datediff) in sql and the number of days in c# (calculated by DateTime.now.Substract) to be the same, but they return different results....
//returns 0
int reso = DateTime.Now.Subtract(expirationDate).Days;
vs
//returns 1
dateDiff(dd,getDate(),ExpirationDate)
In both cases, ExpirationDate is '10/1/2011 00:00:00', and the code and the DB are sitting on the same server. I want the return int to be the same. I suspect I'm missing something stupid... ideas??
dateDiff(dd,getDate(),ExpirationDate) Is doing a days comparison. DateTime.Now.Subtract(expirationDate).Days is doing a date and time
For example
SELECT dateDiff(dd,'10/1/2011 23:59:00' , '10/2/2011') returns one day even when only one minute apart.
If you want the same in C# you need to remove the time component
e.g.
DateTime dt1 = new DateTime(2011,10,1, 23,59,0);
DateTime dt2 = new DateTime(2011,10,2, 0,0,0);
Console.WriteLine((int) dt2.Subtract(dt1.Subtract(dt1.TimeOfDay)));
So in your case it would be something like
DateTime CurrentDate = DateTime.Now;
int reso = CurrentDate.Subtract(CurrentDate.TimeOfDay).Subtract(DateTime.expirationDate).Days;
I haven't tested it but I would not do
DateTime.Now.Subtract(DateTime.Now.Subtract.TimeOfDay)
Because the second call to Now wouldn't be guaranteeing to be the same as first call to Now
In any case Stealth Rabbi's answer seems more elegant anyway since you're looking for a TimeSpan not a DateTime
10/1/2011 is less than 1 day away from DateTime.Now. Since you're getting back a TimeSpan and then applying Days to it, you're getting back a TimeSpan that is < 1 day. So it'll return 0 Days.
Instead, just use the Date component of those DateTimes and it'll correctly report the number of days apart - like this:
DateTime now = DateTime.Now;
DateTime tomorrow = new DateTime(2011, 10, 1);
var val = (tomorrow.Date - now.Date).Days;
This will yield you 1 day.
I'm assuming you want the number of Total days, not the number of days from the largest previous unit. You'd want to use the TotalDays property. Also, you may find it easier to use the minus operator to do a subtraction
DateTime d1 = DateTime.Now;
DateTime d2 = new DateTime(2009, 1, 2);
TimeSpan difference = d1 - d2;
Console.WriteLine(difference.TotalDays); // Outputs (today):1001.46817997424

Datediff getting the date inbetween 2 dates and bind it to a gridview

I have a table with 'dateborrowed' and 'datereturned' column. What I want to do is I want to get the value in between 'datereturned' and 'dateborrowed' and bind it to another column in another table. Also how can I do it using datediff function? I'm still learning it in the meantime. Any help would be greatly appreciated.
Thanks in advance!!
With C#.NET you can subtract one DateTime from another, resulting in a TimeSpan. For example:
TimeSpan timespan = (DateTime.Now - new DateTime(2011, 1, 1));
If you want a date in between two dates, you can then add half of this timespan to one of the dates:
TimeSpan timespan = (DateTime.Now - new DateTime(2011, 1, 1));
DateTime inBetween = DateTime.Now.AddDays(timespan.TotalDays / 2);
TimeSpan ts = Convert.ToDateTime(dr["datereturned"])
- Convert.ToDateTime(dr["dateborrowed"]);
(ts.TotalDays); // Will return the difference in Days

Categories