ICU 4.8.1.1  4.8.1.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
smpdtfmt.h
Go to the documentation of this file.
1 /*
2 * Copyright (C) 1997-2011, 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 
39 
40 class DateFormatSymbols;
41 class DateFormat;
42 class MessageFormat;
43 class FieldPositionHandler;
44 class TimeZoneFormat;
45 
217 public:
227  SimpleDateFormat(UErrorCode& status);
228 
240  SimpleDateFormat(const UnicodeString& pattern,
241  UErrorCode& status);
242 
264  SimpleDateFormat(const UnicodeString& pattern,
265  const UnicodeString& override,
266  UErrorCode& status);
267 
280  SimpleDateFormat(const UnicodeString& pattern,
281  const Locale& locale,
282  UErrorCode& status);
283 
305  SimpleDateFormat(const UnicodeString& pattern,
306  const UnicodeString& override,
307  const Locale& locale,
308  UErrorCode& status);
309 
319  SimpleDateFormat(const UnicodeString& pattern,
320  DateFormatSymbols* formatDataToAdopt,
321  UErrorCode& status);
322 
332  SimpleDateFormat(const UnicodeString& pattern,
333  const DateFormatSymbols& formatData,
334  UErrorCode& status);
335 
341 
347 
352  virtual ~SimpleDateFormat();
353 
360  virtual Format* clone(void) const;
361 
369  virtual UBool operator==(const Format& other) const;
370 
371 
372  using DateFormat::format;
373 
390  virtual UnicodeString& format( Calendar& cal,
391  UnicodeString& appendTo,
392  FieldPosition& pos) const;
393 
412  virtual UnicodeString& format( Calendar& cal,
413  UnicodeString& appendTo,
414  FieldPositionIterator* posIter,
415  UErrorCode& status) const;
416 
436  virtual UnicodeString& format( const Formattable& obj,
437  UnicodeString& appendTo,
438  FieldPosition& pos,
439  UErrorCode& status) const;
440 
461  virtual UnicodeString& format( const Formattable& obj,
462  UnicodeString& appendTo,
463  FieldPositionIterator* posIter,
464  UErrorCode& status) const;
465 
476  UnicodeString& format(UDate date,
477  UnicodeString& appendTo,
478  FieldPosition& fieldPosition) const;
479 
492  UnicodeString& format(UDate date,
493  UnicodeString& appendTo,
494  FieldPositionIterator* posIter,
495  UErrorCode& status) const;
496 
506  UnicodeString& format(const Formattable& obj,
507  UnicodeString& appendTo,
508  UErrorCode& status) const;
509 
518  UnicodeString& format(UDate date, UnicodeString& appendTo) const;
519 
539  virtual void parse( const UnicodeString& text,
540  Calendar& cal,
541  ParsePosition& pos) const;
542 
562  UDate parse( const UnicodeString& text,
563  ParsePosition& pos) const;
564 
565 
581  virtual UDate parse( const UnicodeString& text,
582  UErrorCode& status) const;
583 
600  virtual void set2DigitYearStart(UDate d, UErrorCode& status);
601 
617  UDate get2DigitYearStart(UErrorCode& status) const;
618 
625  virtual UnicodeString& toPattern(UnicodeString& result) const;
626 
643  virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
644  UErrorCode& status) const;
645 
654  virtual void applyPattern(const UnicodeString& pattern);
655 
666  virtual void applyLocalizedPattern(const UnicodeString& pattern,
667  UErrorCode& status);
668 
677  virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
678 
685  virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
686 
692  virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
693 
705  static UClassID U_EXPORT2 getStaticClassID(void);
706 
718  virtual UClassID getDynamicClassID(void) const;
719 
729  virtual void adoptCalendar(Calendar* calendarToAdopt);
730 
741  UBool isFieldUnitIgnored(UCalendarDateFields field) const;
742 
743 
755  static UBool isFieldUnitIgnored(const UnicodeString& pattern,
756  UCalendarDateFields field);
757 
758 
759 
768  const Locale& getSmpFmtLocale(void) const;
769 
770 
771 private:
772  friend class DateFormat;
773 
774  void initializeDefaultCentury(void);
775 
776  SimpleDateFormat(); // default constructor not implemented
777 
786  SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
787 
796  SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
797 
801  UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler,
802  UErrorCode& status) const;
803 
818  void subFormat(UnicodeString &appendTo,
819  UChar ch,
820  int32_t count,
821  FieldPositionHandler& handler,
822  Calendar& cal,
823  UErrorCode& status) const; // in case of illegal argument
824 
838  void zeroPaddingNumber(NumberFormat *currentNumberFormat,
839  UnicodeString &appendTo,
840  int32_t value,
841  int32_t minDigits,
842  int32_t maxDigits) const;
843 
848  static UBool isNumeric(UChar formatChar, int32_t count);
849 
857  Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
858 
865  void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
866 
876  void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
877 
884  void initialize(const Locale& locale, UErrorCode& status);
885 
898  int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
899  const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
900 
913  int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
914  const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
915 
929  static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
930  const UnicodeString &text, int32_t &textOffset, UBool lenient);
931 
949  int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
950  UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
951  int32_t patLoc) const;
952 
953  void parseInt(const UnicodeString& text,
954  Formattable& number,
955  ParsePosition& pos,
956  UBool allowNegative,
957  NumberFormat *fmt) const;
958 
959  void parseInt(const UnicodeString& text,
960  Formattable& number,
961  int32_t maxDigits,
962  ParsePosition& pos,
963  UBool allowNegative,
964  NumberFormat *fmt) const;
965 
966  int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
967  int32_t patLoc, UBool isNegative) const;
968 
981  static void translatePattern(const UnicodeString& originalPattern,
982  UnicodeString& translatedPattern,
983  const UnicodeString& from,
984  const UnicodeString& to,
985  UErrorCode& status);
986 
994  void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
995 
1005  int32_t compareSimpleAffix(const UnicodeString& affix,
1006  const UnicodeString& input,
1007  int32_t pos) const;
1008 
1013  int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
1014 
1019  int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
1020 
1024  void appendGMT(NumberFormat *currentNumberFormat,UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const;
1025  void formatGMTDefault(NumberFormat *currentNumberFormat,UnicodeString &appendTo, int32_t offset) const;
1026  int32_t parseGMT(const UnicodeString &text, ParsePosition &pos) const;
1027  int32_t parseGMTDefault(const UnicodeString &text, ParsePosition &pos) const;
1028  UBool isDefaultGMTFormat() const;
1029 
1030  void formatRFC822TZ(UnicodeString &appendTo, int32_t offset) const;
1031 
1035  void initGMTFormatters(UErrorCode &status);
1036 
1040  void initNumberFormatters(const Locale &locale,UErrorCode &status);
1041 
1045  NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
1046 
1050  void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
1051 
1055  static const UCalendarDateFields fgPatternIndexToCalendarField[];
1056 
1060  static const UDateFormatField fgPatternIndexToDateFormatField[];
1061 
1065  TimeZoneFormat *tzFormat() const;
1066 
1073  static const int32_t fgCalendarFieldToLevel[];
1074  static const int32_t fgPatternCharToLevel[];
1075 
1079  UnicodeString fPattern;
1080 
1084  UnicodeString fDateOverride;
1085 
1089  UnicodeString fTimeOverride;
1090 
1091 
1095  Locale fLocale;
1096 
1101  DateFormatSymbols* fSymbols; // Owned
1102 
1106  TimeZoneFormat* fTimeZoneFormat;
1107 
1116  UDate fDefaultCenturyStart;
1117 
1121  /*transient*/ int32_t fDefaultCenturyStartYear;
1122 
1123  enum ParsedTZType {
1124  TZTYPE_UNK,
1125  TZTYPE_STD,
1126  TZTYPE_DST
1127  };
1128 
1129  ParsedTZType tztype; // here to avoid api change
1130 
1131  typedef struct NSOverride {
1132  NumberFormat *nf;
1133  int32_t hash;
1134  NSOverride *next;
1135  } NSOverride;
1136 
1137  /*
1138  * MessageFormat instances used for localized GMT format
1139  */
1140  enum {
1141  kGMTNegativeHMS = 0,
1142  kGMTNegativeHM,
1143  kGMTPositiveHMS,
1144  kGMTPositiveHM,
1145 
1146  kNumGMTFormatters
1147  };
1148  enum {
1149  kGMTNegativeHMSMinLenIdx = 0,
1150  kGMTPositiveHMSMinLenIdx,
1151 
1152  kNumGMTFormatMinLengths
1153  };
1154 
1155  MessageFormat **fGMTFormatters;
1156  // If a GMT hour format has a second field, we need to make sure
1157  // the length of input localized GMT string must match the expected
1158  // length. Otherwise, sub DateForamt handling offset format may
1159  // unexpectedly success parsing input GMT string without second field.
1160  // See #6880 about this issue.
1161  // TODO: SimpleDateFormat should provide an option to invalidate
1162  //
1163  int32_t fGMTFormatHmsMinLen[kNumGMTFormatMinLengths];
1164 
1165  NumberFormat **fNumberFormatters;
1166 
1167  NSOverride *fOverrideList;
1168 
1169  UBool fHaveDefaultCentury;
1170 };
1171 
1172 inline UDate
1174 {
1175  return fDefaultCenturyStart;
1176 }
1177 
1178 inline UnicodeString&
1180  UnicodeString& appendTo,
1181  UErrorCode& status) const {
1182  // Don't use Format:: - use immediate base class only,
1183  // in case immediate base modifies behavior later.
1184  return DateFormat::format(obj, appendTo, status);
1185 }
1186 
1187 inline UnicodeString&
1189  UnicodeString& appendTo,
1190  FieldPosition& pos,
1191  UErrorCode& status) const
1192 {
1193  // Don't use Format:: - use immediate base class only,
1194  // in case immediate base modifies behavior later.
1195  return DateFormat::format(obj, appendTo, pos, status);
1196 }
1197 
1198 inline UnicodeString&
1200  UnicodeString& appendTo,
1201  FieldPositionIterator* posIter,
1202  UErrorCode& status) const
1203 {
1204  // Don't use Format:: - use immediate base class only,
1205  // in case immediate base modifies behavior later.
1206  return DateFormat::format(obj, appendTo, posIter, status);
1207 }
1208 
1209 inline UnicodeString&
1211  UnicodeString& appendTo,
1212  FieldPosition& fieldPosition) const {
1213  // Don't use Format:: - use immediate base class only,
1214  // in case immediate base modifies behavior later.
1215  return DateFormat::format(date, appendTo, fieldPosition);
1216 }
1217 
1218 inline UnicodeString&
1220  UnicodeString& appendTo,
1221  FieldPositionIterator* posIter,
1222  UErrorCode& status) const {
1223  // Don't use Format:: - use immediate base class only,
1224  // in case immediate base modifies behavior later.
1225  return DateFormat::format(date, appendTo, posIter, status);
1226 }
1227 
1228 inline UnicodeString&
1230  return DateFormat::format(date, appendTo);
1231 }
1232 
1234 
1235 #endif /* #if !UCONFIG_NO_FORMATTING */
1236 
1237 #endif // _SMPDTFMT
1238 //eof