ICU 50.1.2  50.1.2
smpdtfmt.h
Go to the documentation of this file.
1 /*
2 * Copyright (C) 1997-2012, 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 
228 public:
238  SimpleDateFormat(UErrorCode& status);
239 
251  SimpleDateFormat(const UnicodeString& pattern,
252  UErrorCode& status);
253 
275  SimpleDateFormat(const UnicodeString& pattern,
276  const UnicodeString& override,
277  UErrorCode& status);
278 
291  SimpleDateFormat(const UnicodeString& pattern,
292  const Locale& locale,
293  UErrorCode& status);
294 
316  SimpleDateFormat(const UnicodeString& pattern,
317  const UnicodeString& override,
318  const Locale& locale,
319  UErrorCode& status);
320 
330  SimpleDateFormat(const UnicodeString& pattern,
331  DateFormatSymbols* formatDataToAdopt,
332  UErrorCode& status);
333 
343  SimpleDateFormat(const UnicodeString& pattern,
344  const DateFormatSymbols& formatData,
345  UErrorCode& status);
346 
352 
358 
363  virtual ~SimpleDateFormat();
364 
371  virtual Format* clone(void) const;
372 
380  virtual UBool operator==(const Format& other) const;
381 
382 
383  using DateFormat::format;
384 
401  virtual UnicodeString& format( Calendar& cal,
402  UnicodeString& appendTo,
403  FieldPosition& pos) const;
404 
423  virtual UnicodeString& format( Calendar& cal,
424  UnicodeString& appendTo,
425  FieldPositionIterator* posIter,
426  UErrorCode& status) const;
427 
447  virtual UnicodeString& format( const Formattable& obj,
448  UnicodeString& appendTo,
449  FieldPosition& pos,
450  UErrorCode& status) const;
451 
472  virtual UnicodeString& format( const Formattable& obj,
473  UnicodeString& appendTo,
474  FieldPositionIterator* posIter,
475  UErrorCode& status) const;
476 
487  UnicodeString& format(UDate date,
488  UnicodeString& appendTo,
489  FieldPosition& fieldPosition) const;
490 
503  UnicodeString& format(UDate date,
504  UnicodeString& appendTo,
505  FieldPositionIterator* posIter,
506  UErrorCode& status) const;
507 
517  UnicodeString& format(const Formattable& obj,
518  UnicodeString& appendTo,
519  UErrorCode& status) const;
520 
529  UnicodeString& format(UDate date, UnicodeString& appendTo) const;
530 
557  virtual void parse( const UnicodeString& text,
558  Calendar& cal,
559  ParsePosition& pos) const;
560 
591  UDate parse( const UnicodeString& text,
592  ParsePosition& pos) const;
593 
594 
628  virtual UDate parse( const UnicodeString& text,
629  UErrorCode& status) const;
630 
647  virtual void set2DigitYearStart(UDate d, UErrorCode& status);
648 
664  UDate get2DigitYearStart(UErrorCode& status) const;
665 
672  virtual UnicodeString& toPattern(UnicodeString& result) const;
673 
690  virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
691  UErrorCode& status) const;
692 
701  virtual void applyPattern(const UnicodeString& pattern);
702 
713  virtual void applyLocalizedPattern(const UnicodeString& pattern,
714  UErrorCode& status);
715 
724  virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
725 
732  virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
733 
739  virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
740 
752  static UClassID U_EXPORT2 getStaticClassID(void);
753 
765  virtual UClassID getDynamicClassID(void) const;
766 
776  virtual void adoptCalendar(Calendar* calendarToAdopt);
777 
778  /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following draft method since it is virtual */
788  virtual void setContext(UDisplayContext value, UErrorCode& status);
789 
790  /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following draft method since it is virtual */
801  virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
802 
803  /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following methods since they are virtual */
811  virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
812 
818  virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
819 
825  virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
826 
827 #ifndef U_HIDE_INTERNAL_API
828 
838  UBool isFieldUnitIgnored(UCalendarDateFields field) const;
839 
840 
852  static UBool isFieldUnitIgnored(const UnicodeString& pattern,
853  UCalendarDateFields field);
854 
863  const Locale& getSmpFmtLocale(void) const;
864 #endif /* U_HIDE_INTERNAL_API */
865 
866 private:
867  friend class DateFormat;
868 
869  void initializeDefaultCentury(void);
870 
871  SimpleDateFormat(); // default constructor not implemented
872 
881  SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
882 
891  SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
892 
896  UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
897 
914  void subFormat(UnicodeString &appendTo,
915  UChar ch,
916  int32_t count,
917  UDisplayContext capitalizationContext,
918  int32_t fieldNum,
919  FieldPositionHandler& handler,
920  Calendar& cal,
921  UErrorCode& status) const; // in case of illegal argument
922 
936  void zeroPaddingNumber(NumberFormat *currentNumberFormat,
937  UnicodeString &appendTo,
938  int32_t value,
939  int32_t minDigits,
940  int32_t maxDigits) const;
941 
946  static UBool isNumeric(UChar formatChar, int32_t count);
947 
951  static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
952 
956  static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
957 
965  Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
966 
973  void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
974 
984  void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
985 
992  void initialize(const Locale& locale, UErrorCode& status);
993 
1007  int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
1008  const UnicodeString* stringArray, int32_t stringArrayCount,
1009  const UnicodeString* monthPattern, Calendar& cal) const;
1010 
1023  int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
1024  const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
1025 
1039  static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
1040  const UnicodeString &text, int32_t &textOffset, UBool lenient);
1041 
1060  int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
1061  UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
1062  int32_t patLoc, MessageFormat * numericLeapMonthFormatter) const;
1063 
1064  void parseInt(const UnicodeString& text,
1065  Formattable& number,
1066  ParsePosition& pos,
1067  UBool allowNegative,
1068  NumberFormat *fmt) const;
1069 
1070  void parseInt(const UnicodeString& text,
1071  Formattable& number,
1072  int32_t maxDigits,
1073  ParsePosition& pos,
1074  UBool allowNegative,
1075  NumberFormat *fmt) const;
1076 
1077  int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
1078  int32_t patLoc, UBool isNegative) const;
1079 
1092  static void translatePattern(const UnicodeString& originalPattern,
1093  UnicodeString& translatedPattern,
1094  const UnicodeString& from,
1095  const UnicodeString& to,
1096  UErrorCode& status);
1097 
1105  void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
1106 
1116  int32_t compareSimpleAffix(const UnicodeString& affix,
1117  const UnicodeString& input,
1118  int32_t pos) const;
1119 
1124  int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
1125 
1130  int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
1131 
1135  void initNumberFormatters(const Locale &locale,UErrorCode &status);
1136 
1140  NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
1141 
1145  void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
1146 
1150  static const UCalendarDateFields fgPatternIndexToCalendarField[];
1151 
1155  static const UDateFormatField fgPatternIndexToDateFormatField[];
1156 
1160  TimeZoneFormat *tzFormat() const;
1161 
1168  static const int32_t fgCalendarFieldToLevel[];
1169  static const int32_t fgPatternCharToLevel[];
1170 
1174  UnicodeString fPattern;
1175 
1179  UnicodeString fDateOverride;
1180 
1184  UnicodeString fTimeOverride;
1185 
1186 
1190  Locale fLocale;
1191 
1196  DateFormatSymbols* fSymbols; // Owned
1197 
1201  TimeZoneFormat* fTimeZoneFormat;
1202 
1211  UDate fDefaultCenturyStart;
1212 
1216  /*transient*/ int32_t fDefaultCenturyStartYear;
1217 
1218  int32_t tztype; // here to avoid api change
1219 
1220  typedef struct NSOverride {
1221  NumberFormat *nf;
1222  int32_t hash;
1223  NSOverride *next;
1224  } NSOverride;
1225 
1226  NumberFormat **fNumberFormatters;
1227 
1228  NSOverride *fOverrideList;
1229 
1230  UBool fHaveDefaultCentury;
1231 
1232  UDisplayContext fCapitalizationContext;
1233 };
1234 
1235 inline UDate
1236 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const
1237 {
1238  return fDefaultCenturyStart;
1239 }
1240 
1241 inline UnicodeString&
1242 SimpleDateFormat::format(const Formattable& obj,
1243  UnicodeString& appendTo,
1244  UErrorCode& status) const {
1245  // Don't use Format:: - use immediate base class only,
1246  // in case immediate base modifies behavior later.
1247  return DateFormat::format(obj, appendTo, status);
1248 }
1249 
1250 inline UnicodeString&
1251 SimpleDateFormat::format(const Formattable& obj,
1252  UnicodeString& appendTo,
1253  FieldPosition& pos,
1254  UErrorCode& status) const
1255 {
1256  // Don't use Format:: - use immediate base class only,
1257  // in case immediate base modifies behavior later.
1258  return DateFormat::format(obj, appendTo, pos, status);
1259 }
1260 
1261 inline UnicodeString&
1262 SimpleDateFormat::format(const Formattable& obj,
1263  UnicodeString& appendTo,
1264  FieldPositionIterator* posIter,
1265  UErrorCode& status) const
1266 {
1267  // Don't use Format:: - use immediate base class only,
1268  // in case immediate base modifies behavior later.
1269  return DateFormat::format(obj, appendTo, posIter, status);
1270 }
1271 
1272 inline UnicodeString&
1273 SimpleDateFormat::format(UDate date,
1274  UnicodeString& appendTo,
1275  FieldPosition& fieldPosition) const {
1276  // Don't use Format:: - use immediate base class only,
1277  // in case immediate base modifies behavior later.
1278  return DateFormat::format(date, appendTo, fieldPosition);
1279 }
1280 
1281 inline UnicodeString&
1282 SimpleDateFormat::format(UDate date,
1283  UnicodeString& appendTo,
1284  FieldPositionIterator* posIter,
1285  UErrorCode& status) const {
1286  // Don't use Format:: - use immediate base class only,
1287  // in case immediate base modifies behavior later.
1288  return DateFormat::format(date, appendTo, posIter, status);
1289 }
1290 
1291 inline UnicodeString&
1292 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
1293  return DateFormat::format(date, appendTo);
1294 }
1295 
1297 
1298 #endif /* #if !UCONFIG_NO_FORMATTING */
1299 
1300 #endif // _SMPDTFMT
1301 //eof
Base class for all formats.
Definition: format.h:94
TimeZoneFormat supports time zone display name formatting and parsing.
Definition: tzfmt.h:164
UCalendarDateFields
Possible fields in a UCalendar.
Definition: ucal.h:183
Abstract base class for all number formats.
Definition: numfmt.h:166
DateFormatSymbols is a public class for encapsulating localizable date-time formatting data – includi...
Definition: dtfmtsym.h:79
Calendar is an abstract base class for converting between a UDate object and a set of integer fields ...
Definition: calendar.h:200
double UDate
Date and Time data type.
Definition: utypes.h:201
virtual UDate parse(const UnicodeString &text, UErrorCode &status) const
Parse a date/time string.
virtual UClassID getDynamicClassID() const =0
ICU4C "poor man's RTTI", returns a UClassID for the actual ICU class.
DateFormat & operator=(const DateFormat &)
Default assignment operator.
void * UClassID
UClassID is used to identify classes without using the compiler's RTTI.
Definition: uobject.h:96
virtual Format * clone() const =0
Clone this object polymorphically.
TimeZone represents a time zone offset, and also figures out daylight savings.
Definition: timezone.h:129
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside...
Definition: utypes.h:358
#define U_NAMESPACE_BEGIN
This is used to begin a declaration of a public ICU C++ API.
Definition: uversion.h:129
FieldPositionIterator returns the field ids and their start/limit positions generated by a call to Fo...
Definition: fpositer.h:53
virtual UnicodeString & format(const Formattable &obj, UnicodeString &appendTo, FieldPosition &pos, UErrorCode &status) const
Format an object to produce a string.
EStyle
Constants for various style patterns.
Definition: datefmt.h:148
uint16_t UChar
Define UChar to be UCHAR_TYPE, if that is #defined (for example, to char16_t), or wchar_t if that is ...
Definition: umachine.h:278
#define U_NAMESPACE_END
This is used to end a declaration of a public ICU C++ API.
Definition: uversion.h:130
UDateFormatField
FieldPosition and UFieldPosition selectors for format fields defined by DateFormat and UDateFormat...
Definition: udat.h:473
UErrorCode
Error code to replace exception handling, so that the code is compatible with all C++ compilers...
Definition: utypes.h:476
SimpleDateFormat is a concrete class for formatting and parsing dates in a language-independent manne...
Definition: smpdtfmt.h:227
FieldPosition is a simple class used by Format and its subclasses to identify fields in formatted out...
Definition: fieldpos.h:106
C++ API: Abstract class for converting dates.
ParsePosition is a simple class used by Format and its subclasses to keep track of the current positi...
Definition: parsepos.h:47
DateFormat is an abstract class for a family of classes that convert dates and times from their inter...
Definition: datefmt.h:138
Basic definitions for ICU, for both C and C++ APIs.
virtual UBool operator==(const Format &) const
Equality operator.
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:246
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:62
virtual void adoptCalendar(Calendar *calendarToAdopt)
Set the calendar to be used by this date format.
int8_t UBool
The ICU boolean type.
Definition: umachine.h:200
A Locale object represents a specific geographical, political, or cultural region.
Definition: locid.h:182