String DateTime::ToFormat(const String& format) const { String s = format.IsEmpty() ? "M/D/YYYY" : format; TimeSpan t = *this; String ampm = "am"; if (s.Contains("am/pm") || s.Contains("AM/PM")) { s = s.Replace("am/pm", "{4}"); s = s.Replace("AM/PM", "{5}"); if (t.Hours() >= 12) { t = t.AddHours(-12); ampm = "pm"; } else if (t.Hours() == 0) t = t.AddHours(12); } String AMPM = ampm.ToUpper(); YearString y(*this); MonthString m(*this); DayString d(*this); s = s .Replace("YYYY", "{0:~~~~}") .Replace("YY", "{0:~~}") .Replace("MMMM", "{1:~~~~}") .Replace("MMM", "{1:~~~}") .Replace("MM", "{1:~~}") .Replace("M", "{1}") .Replace("DDDD", "{2:~~~~}") .Replace("DDD", "{2:~~~}") .Replace("DD", "{2:~~}") .Replace("D", "{2}") .Replace("hh", "{3:HH}") .Replace("h", "{3:H}") .Replace("mm", "{3:MM}") .Replace("m", "{3:M}") .Replace("ss", "{3:SS}") .Replace("s", "{3:S}") .Replace("nnn", "{3:NNN}") .Replace("nn", "{3:NN}") .Replace("n", "{3:N}") .Replace("{3:HH}", "{3:hh}") .Replace("{3:H}", "{3:h}") .Replace("{3:MM}", "{3:mm}") .Replace("{3:M}", "{3:m}") .Replace("{3:SS}", "{3:ss}") .Replace("{3:S}", "{3:s}") .Replace("{3:NNN}", "{3:nnn}") .Replace("{3:NN}", "{3:nn}") .Replace("{3:N}", "{3:n}"); if (s.Contains("{4}")) s = s.Replace("{4}", ampm); if (s.Contains("{5}")) s = s.Replace("{5}", AMPM); return Format(s, y, m, d, t); }
CString DateTime::FormatISO8601(T_enISO8601Format enFormat, bool bBasic, const TimeZone& tz) const throw() { CString cszDate; switch(enFormat) { case formatY: return Format(_T("%Y"), tz); case formatYM: return Format(bBasic ? _T("%Y%m") : _T("%Y-%m"), tz); case formatYMD: return Format(bBasic ? _T("%Y%m%d") : _T("%Y-%m-%d"), tz); case formatYMD_HM_Z: cszDate = Format(bBasic ? _T("%Y%m%dT%H%M") : _T("%Y-%m-%dT%H:%M"), tz); break; case formatYMD_HMS_Z: cszDate = Format(bBasic ? _T("%Y%m%dT%H%M%S") : _T("%Y-%m-%dT%H:%M:%S"), tz); break; case formatYMD_HMSF_Z: { cszDate = Format(bBasic ? _T("%Y%m%dT%H%M%S") : _T("%Y-%m-%dT%H:%M:%S"), tz); CString cszFraction; cszFraction.Format(_T(".%03u"), Millisecond()); cszDate += cszFraction; } break; } // add timezone if (tz.StandardName() == _T("UTC")) cszDate += _T("Z"); else { TimeSpan spTimezone = tz.GetUtcOffset(*this); bool bNegative = spTimezone < TimeSpan(0, 0, 0, 0); TimeSpan spTimezoneAbs = bNegative ? -spTimezone : spTimezone; CString cszTimezone; cszTimezone.Format(bBasic ? _T("%c%02u%02u") : _T("%c%02u:%02u"), !bNegative ? _T('+') : _T('-'), spTimezoneAbs.Hours(), spTimezoneAbs.Minutes()); cszDate += cszTimezone; } return cszDate; }