+\r
+/**\r
+ * Converts a given time to a relative display string (relative to current time)\r
+ * Given time must be in local timezone\r
+ */\r
+CString CAppUtils::ToRelativeTimeString(CTime time)\r
+{\r
+ CString answer;\r
+ // convert to COleDateTime\r
+ SYSTEMTIME sysTime;\r
+ time.GetAsSystemTime( sysTime );\r
+ COleDateTime oleTime( sysTime );\r
+ answer = ToRelativeTimeString(oleTime, COleDateTime::GetCurrentTime());\r
+ // change this to return answer when happy\r
+ return answer;\r
+}\r
+\r
+/**\r
+ * Generates a display string showing the relative time between the two given times as COleDateTimes\r
+ */\r
+CString CAppUtils::ToRelativeTimeString(COleDateTime time,COleDateTime RelativeTo)\r
+{\r
+ CString answer;\r
+ COleDateTimeSpan ts = RelativeTo - time;\r
+ //years\r
+ if(fabs(ts.GetTotalDays()) >= 3*365)\r
+ {\r
+ answer .FormatMessage(_T("%1!d! Years ago"), (int)(ts.GetTotalDays()/365));\r
+ }\r
+ //Months\r
+ if(fabs(ts.GetTotalDays()) >= 60)\r
+ {\r
+ answer.FormatMessage( _T("%1!d! Months ago"), (int)(ts.GetTotalDays()/30) );\r
+ return answer;\r
+ }\r
+ //Weeks\r
+ if(fabs(ts.GetTotalDays()) >= 14)\r
+ {\r
+ answer.FormatMessage(_T("%1!d! Weeks ago"), (int)(ts.GetTotalDays()/7) );\r
+ return answer;\r
+ }\r
+ //Days\r
+ if(fabs(ts.GetTotalDays()) >= 2)\r
+ {\r
+ answer.FormatMessage(_T("%1!d! Days ago"), (int)(ts.GetTotalDays()) );\r
+ return answer;\r
+ }\r
+ //hours\r
+ if(fabs(ts.GetTotalHours()) >= 2)\r
+ {\r
+ answer.FormatMessage(_T("%1!d! Hours ago"), (int)(ts.GetTotalHours()) );\r
+ return answer;\r
+ }\r
+ //minutes\r
+ if(fabs(ts.GetTotalMinutes()) >= 2)\r
+ {\r
+ answer.FormatMessage(_T("%1!d! Minutes ago"), (int)(ts.GetTotalMinutes()) );\r
+ return answer;\r
+ }\r
+ //seconds\r
+ answer.FormatMessage(_T("%1!d! Seconds ago"), (int)(ts.GetTotalSeconds()) );\r
+ return answer;\r
+}\r
+\r