better encapsulation of DateTime object
This commit is contained in:
@@ -0,0 +1,253 @@
|
||||
#include "global.h"
|
||||
#include "DateTime.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
|
||||
DateTime DateTime::GetNowDateTime()
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
DateTime tNow;
|
||||
localtime_r( &now, &tNow );
|
||||
return tNow;
|
||||
}
|
||||
|
||||
DateTime DateTime::GetNowDate()
|
||||
{
|
||||
DateTime tNow = GetNowDateTime();
|
||||
tNow.StripTime();
|
||||
return tNow;
|
||||
}
|
||||
|
||||
void DateTime::StripTime()
|
||||
{
|
||||
tm_hour = 0;
|
||||
tm_min = 0;
|
||||
tm_sec = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Common SQL/XML format: "YYYY-MM-DD HH:MM:SS"
|
||||
//
|
||||
CString DateTime::GetString() const
|
||||
{
|
||||
return ssprintf( "%d-%02d-%02d %02d:%02d:%02d",
|
||||
tm_year+1900,
|
||||
tm_mon+1,
|
||||
tm_mday,
|
||||
tm_hour,
|
||||
tm_min,
|
||||
tm_sec );
|
||||
}
|
||||
|
||||
CString DateTime::GetDateString() const
|
||||
{
|
||||
return ssprintf( "%d-%02d-%02d",
|
||||
tm_year+1900,
|
||||
tm_mon+1,
|
||||
tm_mday );
|
||||
}
|
||||
|
||||
bool DateTime::FromString( const CString sDateTime )
|
||||
{
|
||||
int ret;
|
||||
|
||||
ZERO( *this );
|
||||
|
||||
ret = sscanf( sDateTime, "%d-%d-%d %d:%d:%d",
|
||||
&tm_year,
|
||||
&tm_mon,
|
||||
&tm_mday,
|
||||
&tm_hour,
|
||||
&tm_min,
|
||||
&tm_sec );
|
||||
if( ret == 6 )
|
||||
goto success;
|
||||
|
||||
ret = sscanf( sDateTime, "%d-%d-%d",
|
||||
&tm_year,
|
||||
&tm_mon,
|
||||
&tm_mday );
|
||||
if( ret == 3 )
|
||||
goto success;
|
||||
|
||||
return false;
|
||||
|
||||
success:
|
||||
tm_year -= 1900;
|
||||
tm_mon -= 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
CString DayInYearToString( int iDayInYear )
|
||||
{
|
||||
return ssprintf("DayInYear%03d",iDayInYear);
|
||||
}
|
||||
|
||||
int StringToDayInYear( CString sDayInYear )
|
||||
{
|
||||
int iDayInYear;
|
||||
if( sscanf( sDayInYear, "DayInYear%d", &iDayInYear ) != 1 )
|
||||
return -1;
|
||||
return iDayInYear;
|
||||
}
|
||||
|
||||
static const CString LAST_DAYS_NAME[NUM_LAST_DAYS] =
|
||||
{
|
||||
"Yesterday",
|
||||
"2 Days Ago",
|
||||
"3 Days Ago",
|
||||
"4 Days Ago",
|
||||
"5 Days Ago",
|
||||
"6 Days Ago",
|
||||
"7 Days Ago",
|
||||
};
|
||||
|
||||
CString LastDayToString( int iLastDayIndex )
|
||||
{
|
||||
return LAST_DAYS_NAME[iLastDayIndex];
|
||||
}
|
||||
|
||||
static const CString DAY_OF_WEEK_TO_NAME[DAYS_IN_WEEK] =
|
||||
{
|
||||
"Sunday",
|
||||
"Monday",
|
||||
"Tuesday",
|
||||
"Wednesday",
|
||||
"Thursday",
|
||||
"Friday",
|
||||
"Saturday",
|
||||
};
|
||||
|
||||
CString DayOfWeekToString( int iDayOfWeekIndex )
|
||||
{
|
||||
return DAY_OF_WEEK_TO_NAME[iDayOfWeekIndex];
|
||||
}
|
||||
|
||||
CString HourInDayToString( int iHourInDayIndex )
|
||||
{
|
||||
return ssprintf("%02d:00", iHourInDayIndex);
|
||||
}
|
||||
|
||||
static const CString MONTH_TO_NAME[MONTHS_IN_YEAR] =
|
||||
{
|
||||
"January",
|
||||
"February",
|
||||
"March",
|
||||
"April",
|
||||
"May",
|
||||
"June",
|
||||
"July",
|
||||
"August",
|
||||
"September",
|
||||
"October",
|
||||
"November",
|
||||
"December",
|
||||
};
|
||||
|
||||
CString MonthToString( int iMonthIndex )
|
||||
{
|
||||
return MONTH_TO_NAME[iMonthIndex];
|
||||
}
|
||||
|
||||
CString LastWeekToString( int iLastWeekIndex )
|
||||
{
|
||||
switch( iLastWeekIndex )
|
||||
{
|
||||
case 0: return "This week"; break;
|
||||
case 1: return "Last week"; break;
|
||||
default: return ssprintf("%d weeks ago",iLastWeekIndex); break;
|
||||
}
|
||||
}
|
||||
|
||||
tm AddDays( tm start, int iDaysToMove )
|
||||
{
|
||||
/*
|
||||
* This causes problems on OS X, which doesn't correctly handle range that are below
|
||||
* their normal values (eg. mday = 0). According to the manpage, it should adjust them:
|
||||
*
|
||||
* "If structure members are outside their legal interval, they will be normalized (so
|
||||
* that, e.g., 40 October is changed into 9 November)."
|
||||
*
|
||||
* Instead, it appears to simply fail.
|
||||
*
|
||||
* Refs:
|
||||
* http://bugs.php.net/bug.php?id=10686
|
||||
* http://sourceforge.net/tracker/download.php?group_id=37892&atid=421366&file_id=79179&aid=91133
|
||||
*
|
||||
* Note "Log starting 2004-03-07 03:50:42"; mday is 7, and PrintCaloriesBurned calls us
|
||||
* with iDaysToMove = -7, resulting in an out-of-range value 0. This seems legal, but
|
||||
* OS X chokes on it.
|
||||
*/
|
||||
/* start.tm_mday += iDaysToMove;
|
||||
time_t seconds = mktime( &start );
|
||||
ASSERT( seconds != (time_t)-1 );
|
||||
*/
|
||||
|
||||
/* This handles DST differently: it returns the time that was exactly n*60*60*24 seconds
|
||||
* ago, where the above code always returns the same time of day. I prefer the above
|
||||
* behavior, but I'm not sure that it mattersmatters. */
|
||||
time_t seconds = mktime( &start );
|
||||
seconds += iDaysToMove*60*60*24;
|
||||
|
||||
tm time;
|
||||
localtime_r( &seconds, &time );
|
||||
return time;
|
||||
}
|
||||
|
||||
tm GetYesterday( tm start )
|
||||
{
|
||||
return AddDays( start, -1 );
|
||||
}
|
||||
|
||||
int GetDayOfWeek( tm time )
|
||||
{
|
||||
int iDayOfWeek = time.tm_wday;
|
||||
ASSERT( iDayOfWeek < DAYS_IN_WEEK );
|
||||
return iDayOfWeek;
|
||||
}
|
||||
|
||||
tm GetNextSunday( tm start )
|
||||
{
|
||||
return AddDays( start, DAYS_IN_WEEK-GetDayOfWeek(start) );
|
||||
}
|
||||
|
||||
|
||||
tm GetDayInYearAndYear( int iDayInYearIndex, int iYear )
|
||||
{
|
||||
tm when = GetLocalTime();
|
||||
|
||||
when.tm_mday = iDayInYearIndex;
|
||||
when.tm_year = iYear - 1900;
|
||||
time_t then = mktime( &when );
|
||||
|
||||
when = *localtime( &then );
|
||||
return when;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (c) 2001-2004 Chris Danford
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, and/or sell copies of the Software, and to permit persons to
|
||||
* whom the Software is furnished to do so, provided that the above
|
||||
* copyright notice(s) and this permission notice appear in all copies of
|
||||
* the Software and that both the above copyright notice(s) and this
|
||||
* permission notice appear in supporting documentation.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
||||
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
Reference in New Issue
Block a user