+ // use strftime() to format the same date but in supported
+ // year
+ //
+ // NB: we assume that strftime() doesn't check for the
+ // date validity and will happily format the date
+ // corresponding to Feb 29 of a non leap year (which
+ // may happen if yearReal was leap and year is not)
+ struct tm tmAdjusted;
+ tmAdjusted.tm_hour = tm.hour;
+ tmAdjusted.tm_min = tm.min;
+ tmAdjusted.tm_sec = tm.sec;
+ tmAdjusted.tm_wday = tm.GetWeekDay();
+ tmAdjusted.tm_yday = GetDayOfYear();
+ tmAdjusted.tm_mday = tm.mday;
+ tmAdjusted.tm_mon = tm.mon;
+ tmAdjusted.tm_year = year - 1900;
+ tmAdjusted.tm_isdst = 0; // no DST, already adjusted
+ wxString str = CallStrftime(*p == _T('c') ? _T("%c")
+ : _T("%x"),
+ &tmAdjusted);
+
+ // now replace the occurence of 1999 with the real year
+ wxString strYearReal, strYearReal2;
+ strYearReal.Printf(_T("%04d"), yearReal);
+ strYearReal2.Printf(_T("%02d"), yearReal % 100);
+ str.Replace(strYear, strYearReal);
+ str.Replace(strYear2, strYearReal2);
+
+ // and replace back all occurences of replacement string
+ if ( wasReplaced )
+ {
+ str.Replace(replacement2, strYear2);
+ str.Replace(replacement, strYear);
+ }
+
+ res += str;
+ }
+ break;
+
+ case _T('d'): // day of a month (01-31)
+ tmp.Printf(_T("%02d"), tm.mday);
+ res += tmp;
+ break;
+
+ case _T('H'): // hour in 24h format (00-23)
+ tmp.Printf(_T("%02d"), tm.hour);
+ res += tmp;
+ break;
+
+ case _T('I'): // hour in 12h format (01-12)
+ {
+ // 24h -> 12h, 0h -> 12h too
+ int hour12 = tm.hour > 12 ? tm.hour - 12
+ : tm.hour ? tm.hour : 12;
+ tmp.Printf(_T("%02d"), hour12);
+ res += tmp;
+ }
+ break;
+
+ case _T('j'): // day of the year
+ tmp.Printf(_T("%03d"), GetDayOfYear(tz));
+ res += tmp;
+ break;
+
+ case _T('m'): // month as a number (01-12)
+ tmp.Printf(_T("%02d"), tm.mon + 1);
+ res += tmp;
+ break;
+
+ case _T('M'): // minute as a decimal number (00-59)
+ tmp.Printf(_T("%02d"), tm.min);
+ res += tmp;
+ break;
+
+ case _T('p'): // AM or PM string
+ res += CallStrftime(_T("%p"), &tmTimeOnly);
+ break;
+
+ case _T('S'): // second as a decimal number (00-61)
+ tmp.Printf(_T("%02d"), tm.sec);
+ res += tmp;
+ break;
+
+ case _T('U'): // week number in the year (Sunday 1st week day)
+ tmp.Printf(_T("%02d"),
+ (GetDayOfYear(tz) - tm.GetWeekDay() + 7) / 7);
+ res += tmp;
+ break;
+
+ case _T('W'): // week number in the year (Monday 1st week day)
+ tmp.Printf(_T("%02d"), GetWeekOfYear(tz));
+ res += tmp;
+ break;
+
+ case _T('w'): // weekday as a number (0-6), Sunday = 0
+ tmp.Printf(_T("%d"), tm.GetWeekDay());
+ res += tmp;
+ break;
+
+ // case _T('x'): -- handled with "%c"
+
+ case _T('X'): // locale default time representation
+ // just use strftime() to format the time for us
+ res += CallStrftime(_T("%X"), &tmTimeOnly);
+ break;
+
+ case _T('y'): // year without century (00-99)
+ tmp.Printf(_T("%02d"), tm.year % 100);
+ res += tmp;
+ break;
+
+ case _T('Y'): // year with century
+ tmp.Printf(_T("%04d"), tm.year);
+ res += tmp;
+ break;
+
+ case _T('Z'): // timezone name
+ res += CallStrftime(_T("%Z"), &tmTimeOnly);
+ break;
+
+ default:
+ wxFAIL_MSG(_T("unknown format specificator"));
+
+ // fall through and just copy it nevertheless
+
+ case _T('%'): // a percent sign
+ res += *p;
+ break;
+
+ case 0:
+ wxFAIL_MSG(_T("missing format at the end of string"));
+
+ // just put the '%' which was the last char in format
+ res += _T('%');
+ break;
+ }