ICU 51.2  51.2
smpdtfmt.h
Go to the documentation of this file.
1 /*
2 * Copyright (C) 1997-2013, International Business Machines Corporation and
3 * others. All Rights Reserved.
4 *******************************************************************************
5 *
6 * File SMPDTFMT.H
7 *
8 * Modification History:
9 *
10 * Date Name Description
11 * 02/19/97 aliu Converted from java.
12 * 07/09/97 helena Make ParsePosition into a class.
13 * 07/21/98 stephen Added GMT_PLUS, GMT_MINUS
14 * Changed setTwoDigitStartDate to set2DigitYearStart
15 * Changed getTwoDigitStartDate to get2DigitYearStart
16 * Removed subParseLong
17 * Removed getZoneIndex (added in DateFormatSymbols)
18 * 06/14/99 stephen Removed fgTimeZoneDataSuffix
19 * 10/14/99 aliu Updated class doc to describe 2-digit year parsing
20 * {j28 4182066}.
21 *******************************************************************************
22 */
23 
24 #ifndef SMPDTFMT_H
25 #define SMPDTFMT_H
26 
27 #include "unicode/utypes.h"
28 
34 #if !UCONFIG_NO_FORMATTING
35 
36 #include "unicode/datefmt.h"
37 #include "unicode/udisplaycontext.h"
38 
40 
41 class DateFormatSymbols;
42 class DateFormat;
43 class MessageFormat;
44 class FieldPositionHandler;
45 class TimeZoneFormat;
46 
704 public:
714  SimpleDateFormat(UErrorCode& status);
715 
727  SimpleDateFormat(const UnicodeString& pattern,
728  UErrorCode& status);
729 
751  SimpleDateFormat(const UnicodeString& pattern,
752  const UnicodeString& override,
753  UErrorCode& status);
754 
767  SimpleDateFormat(const UnicodeString& pattern,
768  const Locale& locale,
769  UErrorCode& status);
770 
792  SimpleDateFormat(const UnicodeString& pattern,
793  const UnicodeString& override,
794  const Locale& locale,
795  UErrorCode& status);
796 
806  SimpleDateFormat(const UnicodeString& pattern,
807  DateFormatSymbols* formatDataToAdopt,
808  UErrorCode& status);
809 
819  SimpleDateFormat(const UnicodeString& pattern,
820  const DateFormatSymbols& formatData,
821  UErrorCode& status);
822 
828 
834 
839  virtual ~SimpleDateFormat();
840 
847  virtual Format* clone(void) const;
848 
856  virtual UBool operator==(const Format& other) const;
857 
858 
859  using DateFormat::format;
860 
877  virtual UnicodeString& format( Calendar& cal,
878  UnicodeString& appendTo,
879  FieldPosition& pos) const;
880 
899  virtual UnicodeString& format( Calendar& cal,
900  UnicodeString& appendTo,
901  FieldPositionIterator* posIter,
902  UErrorCode& status) const;
903 
923  virtual UnicodeString& format( const Formattable& obj,
924  UnicodeString& appendTo,
925  FieldPosition& pos,
926  UErrorCode& status) const;
927 
948  virtual UnicodeString& format( const Formattable& obj,
949  UnicodeString& appendTo,
950  FieldPositionIterator* posIter,
951  UErrorCode& status) const;
952 
963  UnicodeString& format(UDate date,
964  UnicodeString& appendTo,
965  FieldPosition& fieldPosition) const;
966 
979  UnicodeString& format(UDate date,
980  UnicodeString& appendTo,
981  FieldPositionIterator* posIter,
982  UErrorCode& status) const;
983 
993  UnicodeString& format(const Formattable& obj,
994  UnicodeString& appendTo,
995  UErrorCode& status) const;
996 
1005  UnicodeString& format(UDate date, UnicodeString& appendTo) const;
1006 
1033  virtual void parse( const UnicodeString& text,
1034  Calendar& cal,
1035  ParsePosition& pos) const;
1036 
1067  UDate parse( const UnicodeString& text,
1068  ParsePosition& pos) const;
1069 
1070 
1104  virtual UDate parse( const UnicodeString& text,
1105  UErrorCode& status) const;
1106 
1123  virtual void set2DigitYearStart(UDate d, UErrorCode& status);
1124 
1140  UDate get2DigitYearStart(UErrorCode& status) const;
1141 
1148  virtual UnicodeString& toPattern(UnicodeString& result) const;
1149 
1166  virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
1167  UErrorCode& status) const;
1168 
1177  virtual void applyPattern(const UnicodeString& pattern);
1178 
1189  virtual void applyLocalizedPattern(const UnicodeString& pattern,
1190  UErrorCode& status);
1191 
1200  virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
1201 
1208  virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
1209 
1215  virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
1216 
1228  static UClassID U_EXPORT2 getStaticClassID(void);
1229 
1241  virtual UClassID getDynamicClassID(void) const;
1242 
1252  virtual void adoptCalendar(Calendar* calendarToAdopt);
1253 
1254  /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
1264  virtual void setContext(UDisplayContext value, UErrorCode& status);
1265 
1266  /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
1277  virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
1278 
1279  /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following methods since they are virtual */
1287  virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
1288 
1294  virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
1295 
1301  virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
1302 
1303 #ifndef U_HIDE_INTERNAL_API
1304 
1314  UBool isFieldUnitIgnored(UCalendarDateFields field) const;
1315 
1316 
1328  static UBool isFieldUnitIgnored(const UnicodeString& pattern,
1329  UCalendarDateFields field);
1330 
1339  const Locale& getSmpFmtLocale(void) const;
1340 #endif /* U_HIDE_INTERNAL_API */
1341 
1342 private:
1343  friend class DateFormat;
1344 
1345  void initializeDefaultCentury(void);
1346 
1347  SimpleDateFormat(); // default constructor not implemented
1348 
1357  SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
1358 
1367  SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
1368 
1372  UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
1373 
1390  void subFormat(UnicodeString &appendTo,
1391  UChar ch,
1392  int32_t count,
1393  UDisplayContext capitalizationContext,
1394  int32_t fieldNum,
1395  FieldPositionHandler& handler,
1396  Calendar& cal,
1397  UErrorCode& status) const; // in case of illegal argument
1398 
1412  void zeroPaddingNumber(NumberFormat *currentNumberFormat,
1413  UnicodeString &appendTo,
1414  int32_t value,
1415  int32_t minDigits,
1416  int32_t maxDigits) const;
1417 
1422  static UBool isNumeric(UChar formatChar, int32_t count);
1423 
1427  static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
1428 
1432  static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
1433 
1441  Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
1442 
1449  void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
1450 
1460  void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
1461 
1468  void initialize(const Locale& locale, UErrorCode& status);
1469 
1483  int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
1484  const UnicodeString* stringArray, int32_t stringArrayCount,
1485  const UnicodeString* monthPattern, Calendar& cal) const;
1486 
1499  int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
1500  const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
1501 
1515  static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
1516  const UnicodeString &text, int32_t &textOffset, UBool lenient);
1517 
1536  int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
1537  UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
1538  int32_t patLoc, MessageFormat * numericLeapMonthFormatter) const;
1539 
1540  void parseInt(const UnicodeString& text,
1541  Formattable& number,
1542  ParsePosition& pos,
1543  UBool allowNegative,
1544  NumberFormat *fmt) const;
1545 
1546  void parseInt(const UnicodeString& text,
1547  Formattable& number,
1548  int32_t maxDigits,
1549  ParsePosition& pos,
1550  UBool allowNegative,
1551  NumberFormat *fmt) const;
1552 
1553  int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
1554  int32_t patLoc, UBool isNegative) const;
1555 
1568  static void translatePattern(const UnicodeString& originalPattern,
1569  UnicodeString& translatedPattern,
1570  const UnicodeString& from,
1571  const UnicodeString& to,
1572  UErrorCode& status);
1573 
1581  void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
1582 
1592  int32_t compareSimpleAffix(const UnicodeString& affix,
1593  const UnicodeString& input,
1594  int32_t pos) const;
1595 
1600  int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
1601 
1606  int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
1607 
1611  void initNumberFormatters(const Locale &locale,UErrorCode &status);
1612 
1616  NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
1617 
1621  void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
1622 
1626  static const UCalendarDateFields fgPatternIndexToCalendarField[];
1627 
1631  static const UDateFormatField fgPatternIndexToDateFormatField[];
1632 
1636  TimeZoneFormat *tzFormat() const;
1637 
1644  static const int32_t fgCalendarFieldToLevel[];
1645  static const int32_t fgPatternCharToLevel[];
1646 
1650  UnicodeString fPattern;
1651 
1655  UnicodeString fDateOverride;
1656 
1660  UnicodeString fTimeOverride;
1661 
1662 
1666  Locale fLocale;
1667 
1672  DateFormatSymbols* fSymbols; // Owned
1673 
1677  TimeZoneFormat* fTimeZoneFormat;
1678 
1687  UDate fDefaultCenturyStart;
1688 
1692  /*transient*/ int32_t fDefaultCenturyStartYear;
1693 
1694  int32_t tztype; // here to avoid api change
1695 
1696  typedef struct NSOverride {
1697  NumberFormat *nf;
1698  int32_t hash;
1699  NSOverride *next;
1700  } NSOverride;
1701 
1702  NumberFormat **fNumberFormatters;
1703 
1704  NSOverride *fOverrideList;
1705 
1706  UBool fHaveDefaultCentury;
1707 
1708  UDisplayContext fCapitalizationContext;
1709 };
1710 
1711 inline UDate
1712 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const
1713 {
1714  return fDefaultCenturyStart;
1715 }
1716 
1717 inline UnicodeString&
1718 SimpleDateFormat::format(const Formattable& obj,
1719  UnicodeString& appendTo,
1720  UErrorCode& status) const {
1721  // Don't use Format:: - use immediate base class only,
1722  // in case immediate base modifies behavior later.
1723  return DateFormat::format(obj, appendTo, status);
1724 }
1725 
1726 inline UnicodeString&
1727 SimpleDateFormat::format(const Formattable& obj,
1728  UnicodeString& appendTo,
1729  FieldPosition& pos,
1730  UErrorCode& status) const
1731 {
1732  // Don't use Format:: - use immediate base class only,
1733  // in case immediate base modifies behavior later.
1734  return DateFormat::format(obj, appendTo, pos, status);
1735 }
1736 
1737 inline UnicodeString&
1738 SimpleDateFormat::format(const Formattable& obj,
1739  UnicodeString& appendTo,
1740  FieldPositionIterator* posIter,
1741  UErrorCode& status) const
1742 {
1743  // Don't use Format:: - use immediate base class only,
1744  // in case immediate base modifies behavior later.
1745  return DateFormat::format(obj, appendTo, posIter, status);
1746 }
1747 
1748 inline UnicodeString&
1749 SimpleDateFormat::format(UDate date,
1750  UnicodeString& appendTo,
1751  FieldPosition& fieldPosition) const {
1752  // Don't use Format:: - use immediate base class only,
1753  // in case immediate base modifies behavior later.
1754  return DateFormat::format(date, appendTo, fieldPosition);
1755 }
1756 
1757 inline UnicodeString&
1758 SimpleDateFormat::format(UDate date,
1759  UnicodeString& appendTo,
1760  FieldPositionIterator* posIter,
1761  UErrorCode& status) const {
1762  // Don't use Format:: - use immediate base class only,
1763  // in case immediate base modifies behavior later.
1764  return DateFormat::format(date, appendTo, posIter, status);
1765 }
1766 
1767 inline UnicodeString&
1768 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
1769  return DateFormat::format(date, appendTo);
1770 }
1771 
1773 
1774 #endif /* #if !UCONFIG_NO_FORMATTING */
1775 
1776 #endif // _SMPDTFMT
1777 //eof