X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a5a83677555023d476401bab5809a1107222c74..77671fd2d684b066b96e210c132a017e82914e4d:/src/common/date.cpp diff --git a/src/common/date.cpp b/src/common/date.cpp index 441a8c7e25..809730cd69 100644 --- a/src/common/date.cpp +++ b/src/common/date.cpp @@ -8,11 +8,11 @@ // Still Further Enhanced by Hill & Simon v3.10 8/05/91 // Version 4 by Charles D. Price 6/27/92 // Integrated into wxWindows by Julian Smart 9th July 1995 -// Modified by: +// Modified by: // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -23,38 +23,33 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif -#include "wx/setup.h" - -#if USE_TIMEDATE +#if wxUSE_TIMEDATE #include "wx/date.h" -#include +#include "wx/intl.h" #include #include #include -#if USE_IOSTREAMH -#include -#else -#include -#endif +#include "wx/ioswrap.h" #include #include #define ABBR_LENGTH 3 -static const char *dayname[] = { - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" +static const wxChar *dayname[] = { + _T("Sunday"), _T("Monday"), _T("Tuesday"), _T("Wednesday"), + _T("Thursday"), _T("Friday"), _T("Saturday") }; -static const char *mname[] = { - "January", "February", "March", "April", "May", "June", "July", "August", - "September", "October", "November", "December" +static const wxChar *mname[] = { + _T("January"), _T("February"), _T("March"), _T("April"), _T("May"), _T("June"), + _T("July"), _T("August"), _T("September"), _T("October"), _T("November"), _T("December") }; static int GauDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; @@ -63,106 +58,108 @@ static int GauDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; IMPLEMENT_DYNAMIC_CLASS(wxDate, wxObject) #endif -//////////////////////////////////////////////////////////// -// Constructors -//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////// + // Constructors + //////////////////////////////////////////////////////////// wxDate::wxDate() { - DisplayFormat=wxMDY; - DisplayOptions='\0'; - month = day = year = day_of_week = 0; - julian = 0; + DisplayFormat=wxMDY; + DisplayOptions='\0'; + month = day = year = day_of_week = 0; + julian = 0; } wxDate::wxDate (long j) : julian(j) { - DisplayFormat=wxMDY; - DisplayOptions='\0'; - julian_to_mdy (); + DisplayFormat=wxMDY; + DisplayOptions='\0'; + julian_to_mdy (); } wxDate::wxDate (int m, int d, int y) : month(m), day(d), year(y) { - DisplayFormat=wxMDY; - DisplayOptions='\0'; - mdy_to_julian (); + DisplayFormat=wxMDY; + DisplayOptions='\0'; + mdy_to_julian (); } wxDate::wxDate (const wxString& dat) { - DisplayFormat=wxMDY; - DisplayOptions='\0'; - if (strcmp(dat, "TODAY") == 0 || strcmp(dat, "today") == 0) - { - // Sets the current date - Set(); - } - else - { - char buf[100]; - strcpy(buf, (char *) (const char *)dat); - - char *token = strtok(buf,"/-"); - month = atoi(token); - day = atoi(strtok(NULL,"/-")); - year = atoi(strtok(NULL," ")); - } + DisplayFormat=wxMDY; + DisplayOptions='\0'; + if (wxStrcmp(dat, _T("TODAY")) == 0 || wxStrcmp(dat, _T("today")) == 0) + { + // Sets the current date + Set(); + } + else + { + wxChar buf[100]; + wxStrcpy(buf, WXSTRINGCAST dat); + + wxChar *save_ptr, *token = wxStrtok(buf,_T("/-"),&save_ptr); + month = wxAtoi(token); + day = wxAtoi(wxStrtok((wxChar *) NULL,_T("/-"),&save_ptr)); + year = wxAtoi(wxStrtok((wxChar *) NULL,_T(" "),&save_ptr)); + } - mdy_to_julian (); + mdy_to_julian (); } wxDate::wxDate (const wxDate &dt) { - DisplayFormat=dt.DisplayFormat; - DisplayOptions=dt.DisplayOptions; - month = dt.month; - day = dt.day; - year = dt.year; - mdy_to_julian (); + DisplayFormat=dt.DisplayFormat; + DisplayOptions=dt.DisplayOptions; + month = dt.month; + day = dt.day; + year = dt.year; + mdy_to_julian (); } void wxDate::operator = (const wxDate &dt) { - DisplayFormat=dt.DisplayFormat; - DisplayOptions=dt.DisplayOptions; - month = dt.month; - day = dt.day; - year = dt.year; - mdy_to_julian (); + DisplayFormat=dt.DisplayFormat; + DisplayOptions=dt.DisplayOptions; + month = dt.month; + day = dt.day; + year = dt.year; + mdy_to_julian (); // wxUSE_TIMEDATE } void wxDate::operator = (const wxString& dat) { - DisplayFormat=wxMDY; - DisplayOptions='\0'; - if (strcmp(dat, "TODAY") == 0 || strcmp(dat, "today") == 0) - { - // Sets the current date - Set(); - } - else - { - char buf[100]; - strcpy(buf, (char *)(const char *)dat); - - char *token = strtok(buf,"/-"); - month = atoi(token); - day = atoi(strtok(NULL,"/-")); - year = atoi(strtok(NULL," ")); - } + DisplayFormat=wxMDY; + DisplayOptions='\0'; + if (wxStrcmp(dat, _T("TODAY")) == 0 || wxStrcmp(dat, _T("today")) == 0) + { + // Sets the current date + Set(); + } + else + { + wxChar buf[100]; + wxStrcpy(buf, WXSTRINGCAST dat); + + wxChar *save_ptr, *token = wxStrtok(buf,_T("/-"),&save_ptr); + month = wxAtoi(token); + day = wxAtoi(wxStrtok((wxChar *) NULL,_T("/-"),&save_ptr)); + year = wxAtoi(wxStrtok((wxChar *) NULL,_T(" "),&save_ptr)); + } - mdy_to_julian (); + mdy_to_julian (); } ////////////////////////////////////////////////////////////// // Conversion operations ////////////////////////////////////////////////////////////// +#ifndef __SALFORDC__ wxDate::operator wxString( void ) { - return FormatDate(); + return FormatDate(); } +#endif ////////////////////////////////////////////////////////////// // Date Arithmetic @@ -170,167 +167,176 @@ wxDate::operator wxString( void ) wxDate wxDate::operator + (long i) { - wxDate dp(julian + i); - return dp; + wxDate dp(julian + i); + return dp; } wxDate wxDate::operator + (int i) { - wxDate dp(julian + (long)i); - return dp; + wxDate dp(julian + (long)i); + return dp; } wxDate wxDate::operator - (long i) { - wxDate dp(julian - i); - return dp; + wxDate dp(julian - i); + return dp; } wxDate wxDate::operator - (int i) { - wxDate dp(julian - (long)i); - return dp; + wxDate dp(julian - (long)i); + return dp; } long wxDate::operator - (const wxDate &dt) { - return ( julian - dt.julian ); + return ( julian - dt.julian ); } wxDate &wxDate::operator += (long i) { - julian += i; - julian_to_mdy(); - return *this; + julian += i; + julian_to_mdy(); + return *this; } wxDate &wxDate::operator -= (long i) { - julian -= i; - julian_to_mdy(); - return *this; + julian -= i; + julian_to_mdy(); + return *this; } wxDate &wxDate::operator ++() { - julian++; + julian++; julian_to_mdy(); - return *this; + return *this; } wxDate &wxDate::operator ++(int) { - julian++; + julian++; julian_to_mdy(); - return *this; + return *this; } wxDate &wxDate::operator --() { - julian--; + julian--; julian_to_mdy(); - return *this; + return *this; } wxDate &wxDate::operator --(int) { - julian--; + julian--; julian_to_mdy(); - return *this; + return *this; } ////////////////////////////////////////////////////////////// // Date comparison ////////////////////////////////////////////////////////////// -bool operator < (const wxDate &dt1, const wxDate &dt2) +bool WXDLLEXPORT operator < (const wxDate &dt1, const wxDate &dt2) { - return ( dt1.julian < dt2.julian ); + return ( dt1.julian < dt2.julian ); } -bool operator <= (const wxDate &dt1, const wxDate &dt2) +bool WXDLLEXPORT operator <= (const wxDate &dt1, const wxDate &dt2) { - return ( (dt1.julian == dt2.julian) || (dt1.julian < dt2.julian) ); + return ( (dt1.julian == dt2.julian) || (dt1.julian < dt2.julian) ); } -bool operator > (const wxDate &dt1, const wxDate &dt2) +bool WXDLLEXPORT operator > (const wxDate &dt1, const wxDate &dt2) { - return ( dt1.julian > dt2.julian ); + return ( dt1.julian > dt2.julian ); } -bool operator >= (const wxDate &dt1, const wxDate &dt2) +bool WXDLLEXPORT operator >= (const wxDate &dt1, const wxDate &dt2) { - return ( (dt1.julian == dt2.julian) || (dt1.julian > dt2.julian) ); + return ( (dt1.julian == dt2.julian) || (dt1.julian > dt2.julian) ); } -bool operator == (const wxDate &dt1, const wxDate &dt2) +bool WXDLLEXPORT operator == (const wxDate &dt1, const wxDate &dt2) { - return ( dt1.julian == dt2.julian ); + return ( dt1.julian == dt2.julian ); } -bool operator != (const wxDate &dt1, const wxDate &dt2) +bool WXDLLEXPORT operator != (const wxDate &dt1, const wxDate &dt2) { - return ( dt1.julian != dt2.julian ); + return ( dt1.julian != dt2.julian ); } + +#if wxUSE_STD_IOSTREAM + //////////////////////////////////////////////////////////////// // Ostream operations //////////////////////////////////////////////////////////////// -ostream &operator << (ostream &os, const wxDate &dt) +ostream WXDLLEXPORT & operator << (ostream &os, const wxDate &dt) { - return os << (const char *) dt.FormatDate(); + return os << dt.FormatDate().mb_str(); } +#endif + ////////////////////////////////////////////////////////////// // Conversion routines ////////////////////////////////////////////////////////////// void wxDate::julian_to_wday (void) { - day_of_week = (int) ((julian + 2) % 7 + 1); + // Correction by Peter Stadel + day_of_week = ((julian - 2) % 7L); +/* + day_of_week = (int) ((julian + 2) % 7 + 1); +*/ } void wxDate::julian_to_mdy () { - long a,b,c,d,e,z,alpha; - z = julian+1; - // dealing with Gregorian calendar reform + long a,b,c,d,e,z,alpha; + z = julian+1; + // dealing with Gregorian calendar reform if (z < 2299161L) - a = z; + a = z; else { - alpha = (long) ((z-1867216.25) / 36524.25); - a = z + 1 + alpha - alpha/4; + alpha = (long) ((z-1867216.25) / 36524.25); + a = z + 1 + alpha - alpha/4; } - b = ( a > 1721423 ? a + 1524 : a + 1158 ); - c = (long) ((b - 122.1) / 365.25); - d = (long) (365.25 * c); - e = (long) ((b - d) / 30.6001); + b = ( a > 1721423 ? a + 1524 : a + 1158 ); + c = (long) ((b - 122.1) / 365.25); + d = (long) (365.25 * c); + e = (long) ((b - d) / 30.6001); day = (int)(b - d - (long)(30.6001 * e)); month = (int)((e < 13.5) ? e - 1 : e - 13); year = (int)((month > 2.5 ) ? (c - 4716) : c - 4715); - julian_to_wday (); + julian_to_wday (); } void wxDate::mdy_to_julian (void) { - int a,b=0; - int work_month=month, work_day=day, work_year=year; - // correct for negative year + int a,b=0; + int work_month=month, work_day=day, work_year=year; + // correct for negative year if (work_year < 0) - work_year++; - if (work_month <= 2) - { work_year--; work_month +=12; } + work_year++; + if (work_month <= 2) + { work_year--; work_month +=12; } - // deal with Gregorian calendar - if (work_year*10000. + work_month*100. + work_day >= 15821015.) - { + // deal with Gregorian calendar + if (work_year*10000. + work_month*100. + work_day >= 15821015.) + { a = (int)(work_year/100.); - b = 2 - a + a/4; - } - julian = (long) (365.25*work_year) + - (long) (30.6001 * (work_month+1)) + work_day + 1720994L + b; - julian_to_wday (); + b = 2 - a + a/4; + } + julian = (long) (365.25*work_year) + + (long) (30.6001 * (work_month+1)) + work_day + 1720994L + b; + julian_to_wday (); } //////////////////////////////////////////////////////////////// @@ -339,107 +345,107 @@ void wxDate::mdy_to_julian (void) wxString wxDate::FormatDate (int type) const { - int actualType = type; - if (actualType == -1) - actualType = DisplayFormat; + int actualType = type; + if (actualType == -1) + actualType = DisplayFormat; - char buf[40]; + wxChar buf[40]; memset( buf, '\0', sizeof(buf) ); - switch ( actualType ) - { - case wxDAY: - if ( (day_of_week < 1) || (day_of_week > 7) ) - strcpy(buf, _("invalid day")); - else - strncpy( buf, _(dayname[day_of_week-1]), - (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); - return wxString(buf); - - case wxMONTH: - if ( (month < 1) || (month > 12) ) - strcpy(buf, _("invalid month")); - else - strncpy( buf, _(mname[month-1]), - (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); - return wxString(buf); - - case wxFULL: - if ( (month < 1) || (month > 12) || (day_of_week < 0) || - (day_of_week > 7) ) - { - strcpy(buf, _("invalid date")); - return wxString(buf); - } - strncpy( buf, _(dayname[day_of_week-1]), - (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); - strcat( buf, ", "); - strncat( buf, _(mname[month-1]), - (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); - strcat( buf, " "); - sprintf( buf+strlen(buf), "%d, %d", day, abs(year) ); - if (year < 0) - strcat(buf,_(" B.C.")); - return wxString(buf); - - case wxEUROPEAN: - if ( (month < 1) || (month > 12) || (day_of_week < 0) || - (day_of_week > 7) ) - { - strcpy(buf, _("invalid date")); - return wxString(buf); - } - sprintf(buf,"%d ", day); - strncat(buf, _(mname[month-1]), - (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); - sprintf( buf+strlen(buf), " %d", abs(year) ); - if (year < 0) - strcat(buf, _(" B.C.")); - return wxString(buf); - - case wxMDY: - default: - if (day==0 || month==0 || year==0) - strcpy(buf, _("invalid date")); - else - sprintf( buf+strlen(buf), "%1d/%1d/%02d", month, day, - (DisplayOptions & wxNO_CENTURY) && (abs(year) > 1899) - ? (abs(year) - (abs(year) / 100 * 100)) - : (abs(year)) ); - return wxString(buf); - } - return wxString(""); + switch ( actualType ) + { + case wxDAY: + if ( (day_of_week < 1) || (day_of_week > 7) ) + wxStrcpy(buf, _("invalid day")); + else + wxStrncpy( buf, wxGetTranslation(dayname[day_of_week-1]), + (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); + return wxString(buf); + + case wxMONTH: + if ( (month < 1) || (month > 12) ) + wxStrcpy(buf, _("invalid month")); + else + wxStrncpy( buf, wxGetTranslation(mname[month-1]), + (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); + return wxString(buf); + + case wxFULL: + if ( (month < 1) || (month > 12) || (day_of_week < 0) || + (day_of_week > 7) ) + { + wxStrcpy(buf, _("invalid date")); + return wxString(buf); + } + wxStrncpy( buf, wxGetTranslation(dayname[day_of_week-1]), + (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); + wxStrcat( buf, _T(", ")); + wxStrncat( buf, wxGetTranslation(mname[month-1]), + (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); + wxStrcat( buf, _T(" ")); + wxSprintf( buf+wxStrlen(buf), _T("%d, %d"), day, abs(year) ); + if (year < 0) + wxStrcat(buf,_(" B.C.")); + return wxString(buf); + + case wxEUROPEAN: + if ( (month < 1) || (month > 12) || (day_of_week < 0) || + (day_of_week > 7) ) + { + wxStrcpy(buf, _("invalid date")); + return wxString(buf); + } + wxSprintf(buf,_T("%d "), day); + wxStrncat(buf, wxGetTranslation(mname[month-1]), + (DisplayOptions & wxDATE_ABBR) ? ABBR_LENGTH : 9); + wxSprintf( buf+wxStrlen(buf), _T(" %d"), abs(year) ); + if (year < 0) + wxStrcat(buf, _(" B.C.")); + return wxString(buf); + + case wxMDY: + default: + if (day==0 || month==0 || year==0) + wxStrcpy(buf, _("invalid date")); + else + wxSprintf( buf+wxStrlen(buf), _T("%1d/%1d/%02d"), month, day, + (DisplayOptions & wxNO_CENTURY) && (abs(year) > 1899) + ? (abs(year) - (abs(year) / 100 * 100)) + : (abs(year)) ); + return wxString(buf); + } + return wxString(_T("")); } void wxDate::SetFormat( int format ) { - DisplayFormat = format; + DisplayFormat = format; } int wxDate::SetOption( int option, bool action ) { - switch ( option ) - { - case wxNO_CENTURY: - if ( action ) - DisplayOptions |= wxNO_CENTURY; - else - { - DisplayOptions &= (~wxNO_CENTURY); - } - return 1; - case wxDATE_ABBR: - if ( action ) - DisplayOptions |= wxDATE_ABBR; - else - { - DisplayOptions &= (~wxDATE_ABBR); - } - return 1; - default: - return 0; - } - return 0; + switch ( option ) + { + case wxNO_CENTURY: + if ( action ) + DisplayOptions |= wxNO_CENTURY; + else + { + DisplayOptions &= (~wxNO_CENTURY); + } + return 1; + case wxDATE_ABBR: + if ( action ) + DisplayOptions |= wxDATE_ABBR; + else + { + DisplayOptions &= (~wxDATE_ABBR); + } + return 1; + default: + return 0; + } + return 0; } /////////////////////////////////////////////////////////////// @@ -448,29 +454,29 @@ int wxDate::SetOption( int option, bool action ) long wxDate::GetJulianDate( void ) const { - return julian; + return julian; } int wxDate::GetDayOfYear( void ) const { - wxDate temp( 1, 1, year ); + wxDate temp( 1, 1, year ); - return (int) (julian - temp.julian + 1); + return (int) (julian - temp.julian + 1); } bool wxDate::IsLeapYear( void ) const { - return ( (year >= 1582) ? - (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ): - (year % 4 == 0) ); + return ( (year >= 1582) ? + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ): + (year % 4 == 0) ); } // Version 4.0 Extension to Public Interface - CDP wxDate& wxDate::Set() { -//#ifdef __WXMSW__ + //#ifdef __WXMSW__ #if 0 struct _dosdate_t sDate; _dos_getdate(&sDate); @@ -481,7 +487,7 @@ wxDate& wxDate::Set() mdy_to_julian(); #else - time_t now = time(NULL); + time_t now = time((time_t *) NULL); struct tm *localTime = localtime(&now); month = localTime->tm_mon + 1; @@ -494,9 +500,9 @@ wxDate& wxDate::Set() } wxDate& wxDate::Set( - int nMonth, - int nDay, - int nYear) + int nMonth, + int nDay, + int nYear) { month = nMonth; year = nYear < 0 ? 9999 : nYear; @@ -504,16 +510,16 @@ wxDate& wxDate::Set( day = nDay < GetDaysInMonth() ? nDay : GetDaysInMonth(); mdy_to_julian(); - return *this; + return *this; } wxDate & wxDate::Set(long j) { - julian = j; + julian = j; - julian_to_mdy(); - return *this; + julian_to_mdy(); + return *this; } @@ -560,12 +566,12 @@ wxDate& wxDate::AddMonths(int nCount) if (month < 1) { month = 12; year--; - } + } if (month > 12) { month = 1; year++; - } + } mdy_to_julian(); return *this; } @@ -579,10 +585,10 @@ wxDate& wxDate::AddYears(int nCount) int wxDate::GetWeekOfMonth() { - // Abs day includes the days from previous month that fills up - // the begin. of the week. - int nAbsDay = day + GetFirstDayOfMonth()-1; - return (nAbsDay-GetDayOfWeek())/7 + 1; + // Abs day includes the days from previous month that fills up + // the begin. of the week. + int nAbsDay = day + GetFirstDayOfMonth()-1; + return (nAbsDay-GetDayOfWeek())/7 + 1; } int wxDate::GetWeekOfYear() @@ -623,32 +629,32 @@ wxString wxDate::GetDayOfWeekName() bool wxDate::IsBetween(const wxDate& first, const wxDate& second) const { - return (julian >= first.julian && julian <= second.julian); + return (julian >= first.julian && julian <= second.julian); } // This function is from NIHCL wxDate wxDate::Previous(int dayOfWeek) const { - int this_day_Of_Week, desired_day_Of_Week; - long j; + int this_day_Of_Week, desired_day_Of_Week; + long j; -// Set the desired and current day of week to start at 0 (Monday) -// and end at 6 (Sunday). + // Set the desired and current day of week to start at 0 (Monday) + // and end at 6 (Sunday). - desired_day_Of_Week = dayOfWeek - 1; // These functions return a value - this_day_Of_Week = GetDayOfWeek() - 1; // from 1-7. Subtract 1 for 0-6. - j = julian; + desired_day_Of_Week = dayOfWeek - 1; // These functions return a value + this_day_Of_Week = GetDayOfWeek() - 1; // from 1-7. Subtract 1 for 0-6. + j = julian; -// Have to determine how many days difference from current day back to -// desired, if any. Special calculation under the 'if' statement to -// effect the wraparound counting from Monday (0) back to Sunday (6). + // Have to determine how many days difference from current day back to + // desired, if any. Special calculation under the 'if' statement to + // effect the wraparound counting from Monday (0) back to Sunday (6). - if (desired_day_Of_Week > this_day_Of_Week) - this_day_Of_Week += 7 - desired_day_Of_Week; - else - this_day_Of_Week -= desired_day_Of_Week; - j -= this_day_Of_Week; // Adjust j to set it at the desired day of week. - return wxDate(j); + if (desired_day_Of_Week > this_day_Of_Week) + this_day_Of_Week += 7 - desired_day_Of_Week; + else + this_day_Of_Week -= desired_day_Of_Week; + j -= this_day_Of_Week; // Adjust j to set it at the desired day of week. + return wxDate(j); } #endif