1

I have two dates first is nowDate {12/20/2014 5:19:31 PM} and second is messageTime {12/20/2014 1:14:12 PM} I want to Compare these dates and calculate the result and show to user,It calculate the time difference between now time and message date My Code is

// Last Message Time
DateTime messageTime = Convert.ToDateTime(lastMessageTime);

int msgYear = messageTime.Year;
int msgMonth = messageTime.Month;
int msgDay = messageTime.Day;
int msgHour = messageTime.Hour;
int msgMinute = messageTime.Minute;

//Current Date Time
DateTime nowDate = DateTime.Now;

// TimeSpan difference = nowDate.Subtract(messageTime);
int nowYear = nowDate.Year;
int nowMonth = nowDate.Month;
int nowDay = nowDate.Day;
int nowHour = nowDate.Hour;
int nowMinute = nowDate.Minute;

if (msgYear == nowYear)
{
    if (msgMonth == nowMonth)
    {
        if (msgDay == nowDay)
        {
            if (msgHour == nowHour)
            {
                if (msgMinute == nowMinute)
                {
                    lastMessageTime = "Just Now";
                }
                else
                {
                    if (nowMinute - msgMinute == 1)
                        lastMessageTime = "1 minute ago";
                    else
                        lastMessageTime = nowMinute - msgMinute + " minutes ago";
                }
            }
            else
            {
                if (nowHour - msgHour == 1)
                   lastMessageTime = "1 hour ago";
                else
                   lastMessageTime = nowHour - msgHour + " hours ago";
            }
        }
        else
        {
            if (nowDay - msgDay == 1)
               lastMessageTime = "1 Day ago";
            else
               lastMessageTime = nowDay - msgDay + " days ago";
        }
    }
    else
    {
        if (nowMonth - msgMonth == 1)
           lastMessageTime = "1 month ago";
        else
           lastMessageTime = nowMonth - msgMonth + " months ago";
    }
}
else
{
    if (nowYear - msgYear == 1)
       lastMessageTime = "1 year ago";
    else
       lastMessageTime = nowYear - msgYear + " years ago";
}

But problem with this code. Suppose last message time is 12/20/2014 05:59:31 PM and current time is 12/20/2014 06:00:31 PM it displays result as 1 hour ago but the actual difference is 1 minute and something, please help someone

Charan Ghate
  • 1,384
  • 15
  • 32
  • 2
    if you subtract the two dates, d1-d2, you get a timespan, which is what you want. – dbugger Dec 20 '14 at 12:14
  • .Net allow you to do arithmetic on datetime just like number, however, the result will be of type TimeSpan. You can then find out the total different via one of it properties. Don't reinvent the wheel and over engineer. – Tien Dinh Dec 20 '14 at 12:57

3 Answers3

7

Your code seems complicated.

When you wanna compare DateTime's, you can use < or > operator. And you can use - operator to get their difference.

DateTime messageTime = Convert.ToDateTime(lastMessageTime);
DateTime nowDate = DateTime.Now;
TimeSpan diff;

if(messageTime > nowDate)
   diff = messageTime - nowDate;
if(messageTime < nowDate)
   diff = nowDate - messageTime ;

And you can use TimeSpan properties to get the difference minutes, hours, days etc..

Console.WriteLine (diff.Minutes);
Console.WriteLine (diff.Hours);
Console.WriteLine (diff.Days);

Also related: Calculate relative time in C#

Community
  • 1
  • 1
Soner Gönül
  • 97,193
  • 102
  • 206
  • 364
  • With TimeSpan you'll stop at TotalDays. If they want TotalYears (like, how old is smbdy?) - you need to work with specific date parts (you never know what total days means in total years because of leap years) – Lanorkin Dec 20 '14 at 12:22
  • @CharanGhate It was a pseudo code. Updated my answer. – Soner Gönül Dec 20 '14 at 12:46
  • @Soner Gönül it works but how do i calculate Months and Year using this code? – Charan Ghate Dec 20 '14 at 12:46
  • It throws an error, the code should be TimeSpan diff = TimeSpan.Zero; – Charan Ghate Dec 20 '14 at 12:49
  • 1
    @CharanGhate Read this: http://stackoverflow.com/questions/1525990/how-can-i-calculate-the-difference-in-months-between-two-dates same approach will be for Year as well. – Soner Gönül Dec 20 '14 at 12:49
0

You can write your own code, but take look at the humaninzer: http://www.hanselman.com/blog/NuGetPackageOfTheWeekHumanizerMakesNETDataTypesMoreHuman.aspx

To do it your self, you should use the TimeSpan class. When you add or substract two dates, you get a TimeSpan see the example provided by Soner

Kishen
  • 36
  • 2
0

I have the answer :)

 private void getDifference_Click(object sender, EventArgs e)
    {
        DateTime messageTime = Convert.ToDateTime("02/20/2013 6:21:12 PM");
        DateTime nowDate = DateTime.Now;
        TimeSpan diff = TimeSpan.Zero;

        if (messageTime > nowDate)
            diff = messageTime - nowDate;
        if (messageTime < nowDate)
            diff = nowDate - messageTime;

        int intSeconds = diff.Seconds;
        int intMinutes = diff.Minutes;
        int intDays = diff.Days;
        int intMonths = 0;
        int intYear = 0;
        if (intDays > 31)
        {
            intMonths = MonthDifference(nowDate, messageTime);
        }
        if (intMonths > 12)
        {
            string strYear = Convert.ToString(intMonths / 12);
            string[] strParts = strYear.Split('.');
            intYear = Convert.ToInt32(strParts[0].ToString());
        }
        string lastMessageTime = "";
        if (intYear == 0)
        {
            if (intMonths == 0)
            {
                if (intDays == 0)
                {
                    if (intMinutes == 0)
                    {
                        lastMessageTime = "just now";
                    }
                    else
                    {
                        if (intMinutes == 1)
                            lastMessageTime = "1 minute ago";
                        else
                            lastMessageTime = intMinutes + " minutes ago";
                    }
                }
                else
                {
                    if (intDays == 1)
                        lastMessageTime = "1 day ago";
                    else
                        lastMessageTime = intDays + " days ago";
                }
            }
            else
            {
                if (intMonths == 1)
                    lastMessageTime = "1 month ago";
                else
                    lastMessageTime = intMonths + " months ago";
            }
        }
        else
        {
            if (intYear == 1)
                lastMessageTime = "1 year ago";
            else
                lastMessageTime = intYear + " years ago";
        }


    }
    public int MonthDifference(DateTime nowDate, DateTime messageTime)
    {
        return (nowDate.Month - messageTime.Month) + 12 * (nowDate.Year - messageTime.Year);
    }
Charan Ghate
  • 1,384
  • 15
  • 32