1c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/******************************************************************************* 2c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Copyright (C) 2008-2015, International Business Machines Corporation and 3c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru* others. All Rights Reserved. 4c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru******************************************************************************* 5c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru* 6c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru* File DTITVFMT.CPP 7c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru* 8c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru******************************************************************************* 9c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru*/ 10c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "utypeinfo.h" // for 'typeid' to work 1227f654740f2a26ad62a5c155af9199af9e69b889claireho 13c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/dtitvfmt.h" 14c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 15c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 16c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 17b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//TODO: put in compilation 18c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//#define DTITVFMT_DEBUG 1 19c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 20c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "cstring.h" 21c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/msgfmt.h" 22c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/dtptngen.h" 23c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/dtitvinf.h" 24c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/calendar.h" 25c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "dtitv_impl.h" 26c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 27c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#ifdef DTITVFMT_DEBUG 28c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include <iostream> 29c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "cstring.h" 30c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 31c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 32c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "gregoimp.h" 33c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 34c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_NAMESPACE_BEGIN 35c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 36c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 37c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#ifdef DTITVFMT_DEBUG 39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PRINTMESG(msg) { std::cout << "(" << __FILE__ << ":" << __LINE__ << ") " << msg << "\n"; } 40c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 41c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 42c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 43c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic const UChar gDateFormatSkeleton[][11] = { 44c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//yMMMMEEEEd 45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{LOW_Y, CAP_M, CAP_M, CAP_M, CAP_M, CAP_E, CAP_E, CAP_E, CAP_E, LOW_D, 0}, 46c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//yMMMMd 47c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{LOW_Y, CAP_M, CAP_M, CAP_M, CAP_M, LOW_D, 0}, 48c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//yMMMd 49c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{LOW_Y, CAP_M, CAP_M, CAP_M, LOW_D, 0}, 50c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//yMd 51c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{LOW_Y, CAP_M, LOW_D, 0} }; 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic const char gDateTimePatternsTag[]="DateTimePatterns"; 55c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// latestFirst: 58b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar gLaterFirstPrefix[] = {LOW_L, LOW_A, LOW_T, LOW_E, LOW_S,LOW_T, CAP_F, LOW_I, LOW_R, LOW_S, LOW_T, COLON}; 59c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 60c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// earliestFirst: 61b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar gEarlierFirstPrefix[] = {LOW_E, LOW_A, LOW_R, LOW_L, LOW_I, LOW_E, LOW_S, LOW_T, CAP_F, LOW_I, LOW_R, LOW_S, LOW_T, COLON}; 62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 64c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateIntervalFormat) 65c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 66c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 67c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 68c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat* U_EXPORT2 69c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::createInstance(const UnicodeString& skeleton, 70c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 71c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return createInstance(skeleton, Locale::getDefault(), status); 72c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 73c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 74c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 75c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat* U_EXPORT2 76c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::createInstance(const UnicodeString& skeleton, 77c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const Locale& locale, 78c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 79c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#ifdef DTITVFMT_DEBUG 80c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char result[1000]; 81c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char result_1[1000]; 82c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char mesg[2000]; 83c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton.extract(0, skeleton.length(), result, "UTF-8"); 84c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString pat; 85c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ((SimpleDateFormat*)dtfmt)->toPattern(pat); 86c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pat.extract(0, pat.length(), result_1, "UTF-8"); 87c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru sprintf(mesg, "skeleton: %s; pattern: %s\n", result, result_1); 88c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PRINTMESG(mesg) 89c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 90c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 91c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DateIntervalInfo* dtitvinf = new DateIntervalInfo(locale, status); 92b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return create(locale, dtitvinf, &skeleton, status); 93c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 94c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 95c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 96c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 97c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat* U_EXPORT2 98c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::createInstance(const UnicodeString& skeleton, 99c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const DateIntervalInfo& dtitvinf, 100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return createInstance(skeleton, Locale::getDefault(), dtitvinf, status); 102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 104c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat* U_EXPORT2 106c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::createInstance(const UnicodeString& skeleton, 107c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const Locale& locale, 108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const DateIntervalInfo& dtitvinf, 109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DateIntervalInfo* ptn = dtitvinf.clone(); 111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return create(locale, ptn, &skeleton, status); 112c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 113c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 114c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 115c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::DateIntervalFormat() 116c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru: fInfo(NULL), 117c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat(NULL), 118c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar(NULL), 119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fToCalendar(NULL), 120c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fLocale(Locale::getRoot()), 121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDatePattern(NULL), 122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fTimePattern(NULL), 123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateTimeFormat(NULL) 124c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{} 125c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 126c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 127c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::DateIntervalFormat(const DateIntervalFormat& itvfmt) 128c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru: Format(itvfmt), 129c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo(NULL), 130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat(NULL), 131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar(NULL), 132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fToCalendar(NULL), 133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fLocale(itvfmt.fLocale), 134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDatePattern(NULL), 135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fTimePattern(NULL), 136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateTimeFormat(NULL) { 137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *this = itvfmt; 138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat& 142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::operator=(const DateIntervalFormat& itvfmt) { 143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( this != &itvfmt ) { 144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fDateFormat; 145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fInfo; 146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fFromCalendar; 147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fToCalendar; 148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fDatePattern; 149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fTimePattern; 150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fDateTimeFormat; 151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( itvfmt.fDateFormat ) { 152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat = (SimpleDateFormat*)itvfmt.fDateFormat->clone(); 153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat = NULL; 155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( itvfmt.fInfo ) { 157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo = itvfmt.fInfo->clone(); 158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo = NULL; 160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( itvfmt.fFromCalendar ) { 162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar = itvfmt.fFromCalendar->clone(); 163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 164c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar = NULL; 165c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 166c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( itvfmt.fToCalendar ) { 167c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fToCalendar = itvfmt.fToCalendar->clone(); 168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fToCalendar = NULL; 170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fSkeleton = itvfmt.fSkeleton; 172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t i; 173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for ( i = 0; i< DateIntervalInfo::kIPI_MAX_INDEX; ++i ) { 174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fIntervalPatterns[i] = itvfmt.fIntervalPatterns[i]; 175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 176c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fLocale = itvfmt.fLocale; 177c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDatePattern = (itvfmt.fDatePattern)? (UnicodeString*)itvfmt.fDatePattern->clone(): NULL; 178c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fTimePattern = (itvfmt.fTimePattern)? (UnicodeString*)itvfmt.fTimePattern->clone(): NULL; 179c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateTimeFormat = (itvfmt.fDateTimeFormat)? (UnicodeString*)itvfmt.fDateTimeFormat->clone(): NULL; 180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return *this; 182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::~DateIntervalFormat() { 186c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fInfo; 187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fDateFormat; 188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fFromCalendar; 189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fToCalendar; 190c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fDatePattern; 191c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fTimePattern; 192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fDateTimeFormat; 193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruFormat* 197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::clone(void) const { 198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return new DateIntervalFormat(*this); 199c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool 203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::operator==(const Format& other) const { 20427f654740f2a26ad62a5c155af9199af9e69b889claireho if (typeid(*this) == typeid(other)) { 20527f654740f2a26ad62a5c155af9199af9e69b889claireho const DateIntervalFormat* fmt = (DateIntervalFormat*)&other; 206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#ifdef DTITVFMT_DEBUG 207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool equal; 208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru equal = (this == fmt); 209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru equal = (*fInfo == *fmt->fInfo); 211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru equal = (*fDateFormat == *fmt->fDateFormat); 212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru equal = fFromCalendar->isEquivalentTo(*fmt->fFromCalendar) ; 213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru equal = fToCalendar->isEquivalentTo(*fmt->fToCalendar) ; 214c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru equal = (fSkeleton == fmt->fSkeleton); 215c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert equal = ((fDatePattern == NULL && fmt->fDatePattern == NULL) || (fDatePattern && fmt->fDatePattern && *fDatePattern == *fmt->fDatePattern)); 216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert equal = ((fTimePattern == NULL && fmt->fTimePattern == NULL) || (fTimePattern && fmt->fTimePattern && *fTimePattern == *fmt->fTimePattern)); 217c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert equal = ((fDateTimeFormat == NULL && fmt->fDateTimeFormat == NULL) || (fDateTimeFormat && fmt->fDateTimeFormat && *fDateTimeFormat == *fmt->fDateTimeFormat)); 218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 219c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool res; 220c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru res = ( this == fmt ) || 221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ( Format::operator==(other) && 222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo && 223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ( *fInfo == *fmt->fInfo ) && 224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat && 225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ( *fDateFormat == *fmt->fDateFormat ) && 226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar && 227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar->isEquivalentTo(*fmt->fFromCalendar) && 228c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fToCalendar && 229c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fToCalendar->isEquivalentTo(*fmt->fToCalendar) && 230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fSkeleton == fmt->fSkeleton && 231c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ((fDatePattern == NULL && fmt->fDatePattern == NULL) || (fDatePattern && fmt->fDatePattern && *fDatePattern == *fmt->fDatePattern)) && 232c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ((fTimePattern == NULL && fmt->fTimePattern == NULL) || (fTimePattern && fmt->fTimePattern && *fTimePattern == *fmt->fTimePattern)) && 233c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ((fDateTimeFormat == NULL && fmt->fDateTimeFormat == NULL) || (fDateTimeFormat && fmt->fDateTimeFormat && *fDateTimeFormat == *fmt->fDateTimeFormat)) && fLocale == fmt->fLocale); 234c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t i; 235c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (i = 0; i< DateIntervalInfo::kIPI_MAX_INDEX && res == TRUE; ++i ) { 236c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru res = ( fIntervalPatterns[i].firstPart == 237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fmt->fIntervalPatterns[i].firstPart) && 238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ( fIntervalPatterns[i].secondPart == 239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fmt->fIntervalPatterns[i].secondPart ) && 240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ( fIntervalPatterns[i].laterDateFirst == 241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fmt->fIntervalPatterns[i].laterDateFirst) ; 242c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return res; 244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return FALSE; 246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 247c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 249c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUnicodeString& 251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::format(const Formattable& obj, 252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& appendTo, 253c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru FieldPosition& fieldPosition, 254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) const { 255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 259c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( obj.getType() == Formattable::kObject ) { 260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UObject* formatObj = obj.getObject(); 26127f654740f2a26ad62a5c155af9199af9e69b889claireho const DateInterval* interval = dynamic_cast<const DateInterval*>(formatObj); 26227f654740f2a26ad62a5c155af9199af9e69b889claireho if (interval != NULL){ 26327f654740f2a26ad62a5c155af9199af9e69b889claireho return format(interval, appendTo, fieldPosition, status); 264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 266c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUnicodeString& 272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::format(const DateInterval* dtInterval, 273c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& appendTo, 274c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru FieldPosition& fieldPosition, 275c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) const { 276c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 278c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( fFromCalendar != NULL && fToCalendar != NULL && 281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat != NULL && fInfo != NULL ) { 282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar->setTime(dtInterval->getFromDate(), status); 283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fToCalendar->setTime(dtInterval->getToDate(), status); 284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_SUCCESS(status) ) { 285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return format(*fFromCalendar, *fToCalendar, appendTo,fieldPosition, status); 286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUnicodeString& 293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::format(Calendar& fromCalendar, 294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Calendar& toCalendar, 295c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& appendTo, 296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru FieldPosition& pos, 297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) const { 298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // not support different calendar types and time zones 303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru //if ( fromCalendar.getType() != toCalendar.getType() ) { 30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if ( !fromCalendar.isEquivalentTo(toCalendar) ) { 305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // First, find the largest different calendar field. 310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UCalendarDateFields field = UCAL_FIELD_COUNT; 311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( fromCalendar.get(UCAL_ERA,status) != toCalendar.get(UCAL_ERA,status)) { 313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru field = UCAL_ERA; 314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( fromCalendar.get(UCAL_YEAR, status) != 315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru toCalendar.get(UCAL_YEAR, status) ) { 316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru field = UCAL_YEAR; 317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( fromCalendar.get(UCAL_MONTH, status) != 318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru toCalendar.get(UCAL_MONTH, status) ) { 319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru field = UCAL_MONTH; 320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( fromCalendar.get(UCAL_DATE, status) != 321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru toCalendar.get(UCAL_DATE, status) ) { 322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru field = UCAL_DATE; 323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( fromCalendar.get(UCAL_AM_PM, status) != 324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru toCalendar.get(UCAL_AM_PM, status) ) { 325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru field = UCAL_AM_PM; 326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( fromCalendar.get(UCAL_HOUR, status) != 327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru toCalendar.get(UCAL_HOUR, status) ) { 328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru field = UCAL_HOUR; 329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( fromCalendar.get(UCAL_MINUTE, status) != 330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru toCalendar.get(UCAL_MINUTE, status) ) { 331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru field = UCAL_MINUTE; 332c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } else if ( fromCalendar.get(UCAL_SECOND, status) != 333c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert toCalendar.get(UCAL_SECOND, status) ) { 334c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert field = UCAL_SECOND; 335c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 336c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( field == UCAL_FIELD_COUNT ) { 341c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /* ignore the millisecond etc. small fields' difference. 342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * use single date when all the above are the same. 343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return fDateFormat->format(fromCalendar, appendTo, pos); 345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 346c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UBool fromToOnSameDay = (field==UCAL_AM_PM || field==UCAL_HOUR || field==UCAL_MINUTE || field==UCAL_SECOND); 347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // following call should not set wrong status, 349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // all the pass-in fields are valid till here 350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t itvPtnIndex = DateIntervalInfo::calendarFieldToIntervalIndex(field, 351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status); 352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const PatternInfo& intervalPattern = fIntervalPatterns[itvPtnIndex]; 353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( intervalPattern.firstPart.isEmpty() && 355c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru intervalPattern.secondPart.isEmpty() ) { 356c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( fDateFormat->isFieldUnitIgnored(field) ) { 357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* the largest different calendar field is small than 358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * the smallest calendar field in pattern, 359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * return single date format. 360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return fDateFormat->format(fromCalendar, appendTo, pos); 362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 363c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status); 364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // If the first part in interval pattern is empty, 366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the 2nd part of it saves the full-pattern used in fall-back. 367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // For a 'real' interval pattern, the first part will never be empty. 368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( intervalPattern.firstPart.isEmpty() ) { 369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // fall back 370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString originalPattern; 371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->toPattern(originalPattern); 372c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->applyPattern(intervalPattern.secondPart); 373c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert appendTo = fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status); 374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->applyPattern(originalPattern); 375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Calendar* firstCal; 378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Calendar* secondCal; 379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( intervalPattern.laterDateFirst ) { 380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru firstCal = &toCalendar; 381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru secondCal = &fromCalendar; 382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 383c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru firstCal = &fromCalendar; 384c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru secondCal = &toCalendar; 385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // break the interval pattern into 2 parts, 387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // first part should not be empty, 388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString originalPattern; 389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->toPattern(originalPattern); 390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->applyPattern(intervalPattern.firstPart); 391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->format(*firstCal, appendTo, pos); 392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( !intervalPattern.secondPart.isEmpty() ) { 393c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->applyPattern(intervalPattern.secondPart); 394c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert FieldPosition otherPos; 395c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert otherPos.setField(pos.getField()); 396c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->format(*secondCal, appendTo, otherPos); 397c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (pos.getEndIndex() == 0 && otherPos.getEndIndex() > 0) { 398c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert pos = otherPos; 399c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->applyPattern(originalPattern); 402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::parseObject(const UnicodeString& /* source */, 409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Formattable& /* result */, 410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ParsePosition& /* parse_pos */) const { 411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // parseObject(const UnicodeString&, Formattable&, UErrorCode&) const 412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // will set status as U_INVALID_FORMAT_ERROR if 413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // parse_pos is still 0 414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst DateIntervalInfo* 420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::getDateIntervalInfo() const { 421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return fInfo; 422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::setDateIntervalInfo(const DateIntervalInfo& newItvPattern, 427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fInfo; 429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo = new DateIntervalInfo(newItvPattern); 430c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 431c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Delete patterns that get reset by initializePattern 432c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fDatePattern; 433c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDatePattern = NULL; 434c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fTimePattern; 435c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fTimePattern = NULL; 436c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete fDateTimeFormat; 437c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateTimeFormat = NULL; 438c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( fDateFormat ) { 440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru initializePattern(status); 441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst DateFormat* 447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::getDateFormat() const { 448c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return fDateFormat; 449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoDateIntervalFormat::adoptTimeZone(TimeZone* zone) 454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fDateFormat != NULL) { 456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDateFormat->adoptTimeZone(zone); 457b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // The fDateFormat has the master calendar for the DateIntervalFormat and has 459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // ownership of any adopted TimeZone; fFromCalendar and fToCalendar are internal 460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // work clones of that calendar (and should not also be given ownership of the 461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // adopted TimeZone). 462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fFromCalendar) { 463c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fFromCalendar->setTimeZone(*zone); 464b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fToCalendar) { 466c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fToCalendar->setTimeZone(*zone); 467b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 468b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoDateIntervalFormat::setTimeZone(const TimeZone& zone) 472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fDateFormat != NULL) { 474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDateFormat->setTimeZone(zone); 475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // The fDateFormat has the master calendar for the DateIntervalFormat; 477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // fFromCalendar and fToCalendar are internal work clones of that calendar. 478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fFromCalendar) { 479c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fFromCalendar->setTimeZone(zone); 480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 481b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fToCalendar) { 482c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fToCalendar->setTimeZone(zone); 483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst TimeZone& 487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoDateIntervalFormat::getTimeZone() const 488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fDateFormat != NULL) { 490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return fDateFormat->getTimeZone(); 491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // If fDateFormat is NULL (unexpected), create default timezone. 493b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return *(TimeZone::createDefault()); 494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 496b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDateIntervalFormat::DateIntervalFormat(const Locale& locale, 497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DateIntervalInfo* dtItvInfo, 498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* skeleton, 499c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) 500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru: fInfo(NULL), 501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fDateFormat(NULL), 502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fFromCalendar(NULL), 503b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fToCalendar(NULL), 504c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fLocale(locale), 505c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDatePattern(NULL), 506c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fTimePattern(NULL), 507c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateTimeFormat(NULL) 508c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 509c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete dtItvInfo; 511c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 512c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 513c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert SimpleDateFormat* dtfmt = 514c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert static_cast<SimpleDateFormat *>( 515c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert DateFormat::createInstanceForSkeleton( 516c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert *skeleton, locale, status)); 517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete dtItvInfo; 519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete dtfmt; 520b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 522c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( dtfmt == NULL || dtItvInfo == NULL) { 523c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 524c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // safe to delete NULL 525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete dtfmt; 526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete dtItvInfo; 527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 528c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 529c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( skeleton ) { 530c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fSkeleton = *skeleton; 531c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 532c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo = dtItvInfo; 533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fDateFormat = dtfmt; 534c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( dtfmt->getCalendar() ) { 535c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar = dtfmt->getCalendar()->clone(); 536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fToCalendar = dtfmt->getCalendar()->clone(); 537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fFromCalendar = NULL; 539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fToCalendar = NULL; 540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 541c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru initializePattern(status); 542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 544c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat* U_EXPORT2 545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDateIntervalFormat::create(const Locale& locale, 546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DateIntervalInfo* dtitvinf, 547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* skeleton, 548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DateIntervalFormat* f = new DateIntervalFormat(locale, dtitvinf, 550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton, status); 551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( f == NULL ) { 552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete dtitvinf; 554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( U_FAILURE(status) ) { 555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // safe to delete f, although nothing acutally is saved 556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete f; 557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru f = 0; 558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return f; 560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/** 565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Initialize interval patterns locale to this formatter 566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * This code is a bit complicated since 568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1. the interval patterns saved in resource bundle files are interval 569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * patterns based on date or time only. 570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * It does not have interval patterns based on both date and time. 571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Interval patterns on both date and time are algorithm generated. 572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * For example, it has interval patterns on skeleton "dMy" and "hm", 574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * but it does not have interval patterns on skeleton "dMyhm". 575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * The rule to genearte interval patterns for both date and time skeleton are 577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1) when the year, month, or day differs, concatenate the two original 578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * expressions with a separator between, 579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * For example, interval pattern from "Jan 10, 2007 10:10 am" 580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * to "Jan 11, 2007 10:10am" is 581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * "Jan 10, 2007 10:10 am - Jan 11, 2007 10:10am" 582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2) otherwise, present the date followed by the range expression 584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * for the time. 585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * For example, interval pattern from "Jan 10, 2007 10:10 am" 586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * to "Jan 10, 2007 11:10am" is 587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * "Jan 10, 2007 10:10 am - 11:10am" 588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2. even a pattern does not request a certion calendar field, 590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * the interval pattern needs to include such field if such fields are 591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * different between 2 dates. 592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * For example, a pattern/skeleton is "hm", but the interval pattern 593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * includes year, month, and date when year, month, and date differs. 594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param status output param set to success/failure code on exit 596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @stable ICU 4.0 597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::initializePattern(UErrorCode& status) { 600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const Locale& locale = fDateFormat->getSmpFmtLocale(); 604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( fSkeleton.isEmpty() ) { 605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString fullPattern; 606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fDateFormat->toPattern(fullPattern); 607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#ifdef DTITVFMT_DEBUG 608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char result[1000]; 609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char result_1[1000]; 610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char mesg[2000]; 611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fSkeleton.extract(0, fSkeleton.length(), result, "UTF-8"); 612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru sprintf(mesg, "in getBestSkeleton: fSkeleton: %s; \n", result); 613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PRINTMESG(mesg) 614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // fSkeleton is already set by createDateIntervalInstance() 616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // or by createInstance(UnicodeString skeleton, .... ) 617c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fSkeleton = DateTimePatternGenerator::staticGetSkeleton( 618c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fullPattern, status); 619c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 620c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 621c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 622c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 624c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // initialize the fIntervalPattern ordering 625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t i; 626c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for ( i = 0; i < DateIntervalInfo::kIPI_MAX_INDEX; ++i ) { 627c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fIntervalPatterns[i].laterDateFirst = fInfo->getDefaultOrder(); 628c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Check whether the skeleton is a combination of date and time. 631c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * For the complication reason 1 explained above. 632c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 633c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString dateSkeleton; 634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString timeSkeleton; 635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString normalizedTimeSkeleton; 636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString normalizedDateSkeleton; 637c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 639c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* the difference between time skeleton and normalizedTimeSkeleton are: 64050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 1. (Formerly, normalized time skeleton folded 'H' to 'h'; no longer true) 641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2. 'a' is omitted in normalized time skeleton. 64250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * 3. there is only one appearance for 'h' or 'H', 'm','v', 'z' in normalized 643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * time skeleton 644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * The difference between date skeleton and normalizedDateSkeleton are: 646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1. both 'y' and 'd' appear only once in normalizeDateSkeleton 647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2. 'E' and 'EE' are normalized into 'EEE' 648c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 3. 'MM' is normalized into 'M' 649c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru getDateTimeSkeleton(fSkeleton, dateSkeleton, normalizedDateSkeleton, 651c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeSkeleton, normalizedTimeSkeleton); 652c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#ifdef DTITVFMT_DEBUG 654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char result[1000]; 655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char result_1[1000]; 656c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char mesg[2000]; 657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fSkeleton.extract(0, fSkeleton.length(), result, "UTF-8"); 658c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru sprintf(mesg, "in getBestSkeleton: fSkeleton: %s; \n", result); 659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PRINTMESG(mesg) 660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 661c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 662c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // move this up here since we need it for fallbacks 663c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( timeSkeleton.length() > 0 && dateSkeleton.length() > 0 ) { 664c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Need the Date/Time pattern for concatenation of the date 665c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // with the time interval. 666c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // The date/time pattern ( such as {0} {1} ) is saved in 667c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // calendar, that is why need to get the CalendarData here. 668c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert CalendarData* calData = new CalendarData(locale, NULL, status); 669c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( U_FAILURE(status) ) { 670c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete calData; 671c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 672c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 673c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( calData == NULL ) { 674c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert status = U_MEMORY_ALLOCATION_ERROR; 675c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 676c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 677c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 678c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UResourceBundle* dateTimePatternsRes = calData->getByKey( 679c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert gDateTimePatternsTag, status); 680c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int32_t dateTimeFormatLength; 681c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UChar* dateTimeFormat = ures_getStringByIndex( 682c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert dateTimePatternsRes, 683c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert (int32_t)DateFormat::kDateTime, 684c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert &dateTimeFormatLength, &status); 685c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( U_SUCCESS(status) && dateTimeFormatLength >= 3 ) { 686c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateTimeFormat = new UnicodeString(dateTimeFormat, dateTimeFormatLength); 687c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 688c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert delete calData; 689c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 690c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 691c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool found = setSeparateDateTimePtn(normalizedDateSkeleton, 692c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedTimeSkeleton); 693c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 694c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // for skeletons with seconds, found is false and we enter this block 695c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( found == false ) { 696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // use fallback 697c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // TODO: if user asks "m"(minute), but "d"(day) differ 698c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( timeSkeleton.length() != 0 ) { 699c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( dateSkeleton.length() == 0 ) { 700c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // prefix with yMd 701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho timeSkeleton.insert(0, gDateFormatSkeleton[DateFormat::kShort], -1); 702c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString pattern = DateFormat::getBestPattern( 703c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert locale, timeSkeleton, status); 704c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 705c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 706c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 707c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // for fall back interval patterns, 708c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the first part of the pattern is empty, 709c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the second part of the pattern is the full-pattern 710c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // should be used in fall-back. 711c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(UCAL_DATE, NULL, &pattern, fInfo->getDefaultOrder()); 712c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(UCAL_MONTH, NULL, &pattern, fInfo->getDefaultOrder()); 713c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(UCAL_YEAR, NULL, &pattern, fInfo->getDefaultOrder()); 714c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 715c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // TODO: fall back 716c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 717c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 718c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // TODO: fall back 719c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 720c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 721c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } // end of skeleton not found 722c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // interval patterns for skeleton are found in resource 723c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( timeSkeleton.length() == 0 ) { 724c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // done 725c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( dateSkeleton.length() == 0 ) { 726c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // prefix with yMd 727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho timeSkeleton.insert(0, gDateFormatSkeleton[DateFormat::kShort], -1); 728c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString pattern = DateFormat::getBestPattern( 729c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert locale, timeSkeleton, status); 730c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 731c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 732c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 733c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // for fall back interval patterns, 734c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the first part of the pattern is empty, 735c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the second part of the pattern is the full-pattern 736c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // should be used in fall-back. 737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(UCAL_DATE, NULL, &pattern, fInfo->getDefaultOrder()); 738c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(UCAL_MONTH, NULL, &pattern, fInfo->getDefaultOrder()); 739c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(UCAL_YEAR, NULL, &pattern, fInfo->getDefaultOrder()); 740c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 741c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* if both present, 742c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1) when the year, month, or day differs, 743c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * concatenate the two original expressions with a separator between, 744c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2) otherwise, present the date followed by the 745c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * range expression for the time. 746c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 747c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 748c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1) when the year, month, or day differs, 749c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * concatenate the two original expressions with a separator between, 750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 751c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // if field exists, use fall back 752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString skeleton = fSkeleton; 753c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( !fieldExistsInSkeleton(UCAL_DATE, dateSkeleton) ) { 754c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // prefix skeleton with 'd' 755c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton.insert(0, LOW_D); 756b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setFallbackPattern(UCAL_DATE, skeleton, status); 757c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 758c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( !fieldExistsInSkeleton(UCAL_MONTH, dateSkeleton) ) { 759c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // then prefix skeleton with 'M' 760c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton.insert(0, CAP_M); 761b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setFallbackPattern(UCAL_MONTH, skeleton, status); 762c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 763c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( !fieldExistsInSkeleton(UCAL_YEAR, dateSkeleton) ) { 764c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // then prefix skeleton with 'y' 765c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton.insert(0, LOW_Y); 766b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setFallbackPattern(UCAL_YEAR, skeleton, status); 767c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 768c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 769c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 770c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2) otherwise, present the date followed by the 771c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * range expression for the time. 772c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 773c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 774c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( fDateTimeFormat == 0 ) { 775c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // earlier failure getting dateTimeFormat 776c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 777c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 778c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 779c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString datePattern = DateFormat::getBestPattern( 780c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert locale, dateSkeleton, status); 781c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 782c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert concatSingleDate2TimeInterval(*fDateTimeFormat, datePattern, UCAL_AM_PM, status); 783c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert concatSingleDate2TimeInterval(*fDateTimeFormat, datePattern, UCAL_HOUR, status); 784c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert concatSingleDate2TimeInterval(*fDateTimeFormat, datePattern, UCAL_MINUTE, status); 785c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 786c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 787c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid U_EXPORT2 791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::getDateTimeSkeleton(const UnicodeString& skeleton, 792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& dateSkeleton, 793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& normalizedDateSkeleton, 794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& timeSkeleton, 795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& normalizedTimeSkeleton) { 796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // dateSkeleton follows the sequence of y*M*E*d* 797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // timeSkeleton follows the sequence of hm*[v|z]? 798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t ECount = 0; 799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t dCount = 0; 800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t MCount = 0; 801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t yCount = 0; 802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t hCount = 0; 80350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t HCount = 0; 804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t mCount = 0; 805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t vCount = 0; 806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t zCount = 0; 807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t i; 808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 809c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (i = 0; i < skeleton.length(); ++i) { 810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar ch = skeleton[i]; 811c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru switch ( ch ) { 812c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_E: 813c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dateSkeleton.append(ch); 814c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++ECount; 815c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 816c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_D: 817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dateSkeleton.append(ch); 818c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++dCount; 819c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 820c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_M: 821c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dateSkeleton.append(ch); 822c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++MCount; 823c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 824c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_Y: 825c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dateSkeleton.append(ch); 826c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++yCount; 827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_G: 829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_Y: 830c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_U: 831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_Q: 832c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_Q: 833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_L: 834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_L: 835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_W: 836c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_W: 837c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_D: 838c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_F: 839c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_G: 840c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_E: 841c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_C: 842fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case CAP_U: 843fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case LOW_R: 844c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedDateSkeleton.append(ch); 845c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dateSkeleton.append(ch); 846c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 847c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_A: 848c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // 'a' is implicitly handled 849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeSkeleton.append(ch); 850c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 851c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_H: 852c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeSkeleton.append(ch); 853c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++hCount; 854c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 85550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case CAP_H: 85650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho timeSkeleton.append(ch); 85750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ++HCount; 85850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 859c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_M: 860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeSkeleton.append(ch); 861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++mCount; 862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 863c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_Z: 864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++zCount; 865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeSkeleton.append(ch); 866c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_V: 868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++vCount; 869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeSkeleton.append(ch); 870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_V: 872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_Z: 873c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_K: 874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_K: 875c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_J: 876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case LOW_S: 877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_S: 878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case CAP_A: 879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeSkeleton.append(ch); 880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedTimeSkeleton.append(ch); 881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* generate normalized form for date*/ 886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( yCount != 0 ) { 88759d709d503bab6e2b61931737e662dd293b40578ccornelius for (i = 0; i < yCount; ++i) { 88859d709d503bab6e2b61931737e662dd293b40578ccornelius normalizedDateSkeleton.append(LOW_Y); 88959d709d503bab6e2b61931737e662dd293b40578ccornelius } 890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( MCount != 0 ) { 892c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( MCount < 3 ) { 893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedDateSkeleton.append(CAP_M); 894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t i; 896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for ( i = 0; i < MCount && i < MAX_M_COUNT; ++i ) { 897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedDateSkeleton.append(CAP_M); 898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 899c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( ECount != 0 ) { 902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( ECount <= 3 ) { 903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedDateSkeleton.append(CAP_E); 904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t i; 906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for ( i = 0; i < ECount && i < MAX_E_COUNT; ++i ) { 907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedDateSkeleton.append(CAP_E); 908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( dCount != 0 ) { 912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedDateSkeleton.append(LOW_D); 913c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* generate normalized form for time */ 91650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if ( HCount != 0 ) { 91750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizedTimeSkeleton.append(CAP_H); 91850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 91950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else if ( hCount != 0 ) { 920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedTimeSkeleton.append(LOW_H); 921c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( mCount != 0 ) { 923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedTimeSkeleton.append(LOW_M); 924c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 925c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( zCount != 0 ) { 926c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedTimeSkeleton.append(LOW_Z); 927c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 928c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( vCount != 0 ) { 929c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru normalizedTimeSkeleton.append(LOW_V); 930c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 931c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 932c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 933c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 934c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/** 935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Generate date or time interval pattern from resource, 936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * and set them into the interval pattern locale to this formatter. 937c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 938c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * It needs to handle the following: 939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1. need to adjust field width. 940c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * For example, the interval patterns saved in DateIntervalInfo 941c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * includes "dMMMy", but not "dMMMMy". 942c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Need to get interval patterns for dMMMMy from dMMMy. 943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Another example, the interval patterns saved in DateIntervalInfo 944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * includes "hmv", but not "hmz". 945c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Need to get interval patterns for "hmz' from 'hmv' 946c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 947c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2. there might be no pattern for 'y' differ for skeleton "Md", 948c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * in order to get interval patterns for 'y' differ, 949c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * need to look for it from skeleton 'yMd' 950c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 951c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param dateSkeleton normalized date skeleton 952c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param timeSkeleton normalized time skeleton 953c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @return whether the resource is found for the skeleton. 954c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * TRUE if interval pattern found for the skeleton, 955c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * FALSE otherwise. 956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @stable ICU 4.0 957c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 958c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool 959c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::setSeparateDateTimePtn( 960c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& dateSkeleton, 961c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& timeSkeleton) { 962c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* skeleton; 963c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // if both date and time skeleton present, 964c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the final interval pattern might include time interval patterns 965c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ( when, am_pm, hour, minute differ ), 966c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // but not date interval patterns ( when year, month, day differ ). 967c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // For year/month/day differ, it falls back to fall-back pattern. 968c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( timeSkeleton.length() != 0 ) { 969c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton = &timeSkeleton; 970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 971c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton = &dateSkeleton; 972c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 973c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 974c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* interval patterns for skeleton "dMMMy" (but not "dMMMMy") 975c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * are defined in resource, 976c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * interval patterns for skeleton "dMMMMy" are calculated by 977c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1. get the best match skeleton for "dMMMMy", which is "dMMMy" 978c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2. get the interval patterns for "dMMMy", 979c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 3. extend "MMM" to "MMMM" in above interval patterns for "dMMMMy" 980c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * getBestSkeleton() is step 1. 981c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 982c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // best skeleton, and the difference information 983c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t differenceInfo = 0; 984c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* bestSkeleton = fInfo->getBestSkeleton(*skeleton, 985c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru differenceInfo); 986c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* best skeleton could be NULL. 987c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru For example: in "ca" resource file, 988c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru interval format is defined as following 989c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru intervalFormats{ 990c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fallback{"{0} - {1}"} 991c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 992c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru there is no skeletons/interval patterns defined, 993c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru and the best skeleton match could be NULL 994c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 995c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( bestSkeleton == NULL ) { 996c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return false; 997c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 998c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 999c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Set patterns for fallback use, need to do this 1000c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // before returning if differenceInfo == -1 1001c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UErrorCode status; 1002c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( dateSkeleton.length() != 0) { 1003c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert status = U_ZERO_ERROR; 1004c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDatePattern = new UnicodeString(DateFormat::getBestPattern( 1005c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fLocale, dateSkeleton, status)); 1006c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1007c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( timeSkeleton.length() != 0) { 1008c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert status = U_ZERO_ERROR; 1009c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fTimePattern = new UnicodeString(DateFormat::getBestPattern( 1010c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fLocale, timeSkeleton, status)); 1011c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1012c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 1013c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // difference: 1014c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // 0 means the best matched skeleton is the same as input skeleton 1015c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // 1 means the fields are the same, but field width are different 1016c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // 2 means the only difference between fields are v/z, 1017c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // -1 means there are other fields difference 1018c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // (this will happen, for instance, if the supplied skeleton has seconds, 1019c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // but no skeletons in the intervalFormats data do) 1020c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( differenceInfo == -1 ) { 1021c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // skeleton has different fields, not only v/z difference 1022c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return false; 1023c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1024c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1025c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( timeSkeleton.length() == 0 ) { 1026c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString extendedSkeleton; 1027c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString extendedBestSkeleton; 1028c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // only has date skeleton 1029c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(UCAL_DATE, skeleton, bestSkeleton, differenceInfo, 1030c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru &extendedSkeleton, &extendedBestSkeleton); 1031c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1032c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool extended = setIntervalPattern(UCAL_MONTH, skeleton, bestSkeleton, 1033c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru differenceInfo, 1034c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru &extendedSkeleton, &extendedBestSkeleton); 1035c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1036c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( extended ) { 1037c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bestSkeleton = &extendedBestSkeleton; 1038c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeleton = &extendedSkeleton; 1039c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1040c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(UCAL_YEAR, skeleton, bestSkeleton, differenceInfo, 1041c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru &extendedSkeleton, &extendedBestSkeleton); 1042c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 1043c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(UCAL_MINUTE, skeleton, bestSkeleton, differenceInfo); 1044c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(UCAL_HOUR, skeleton, bestSkeleton, differenceInfo); 1045c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(UCAL_AM_PM, skeleton, bestSkeleton, differenceInfo); 1046c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1047c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return true; 1048c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1049c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1050c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1051c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1052c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 1053c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::setFallbackPattern(UCalendarDateFields field, 1054c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& skeleton, 1055c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 1056c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 1057c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 1058c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1059c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString pattern = DateFormat::getBestPattern( 1060c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fLocale, skeleton, status); 1061c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 1062c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 1063c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1064c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(field, NULL, &pattern, fInfo->getDefaultOrder()); 1065c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1066c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1067c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1068c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1069c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1070c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 1071c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::setPatternInfo(UCalendarDateFields field, 1072c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* firstPart, 1073c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* secondPart, 1074c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool laterDateFirst) { 1075c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // for fall back interval patterns, 1076c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the first part of the pattern is empty, 1077c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the second part of the pattern is the full-pattern 1078c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // should be used in fall-back. 1079c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1080c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // following should not set any wrong status. 1081c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t itvPtnIndex = DateIntervalInfo::calendarFieldToIntervalIndex(field, 1082c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status); 1083c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 1084c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 1085c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1086c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PatternInfo& ptn = fIntervalPatterns[itvPtnIndex]; 1087c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( firstPart ) { 1088c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ptn.firstPart = *firstPart; 1089c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1090c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( secondPart ) { 1091c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ptn.secondPart = *secondPart; 1092c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1093c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ptn.laterDateFirst = laterDateFirst; 1094c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1095c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1096c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 1097c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::setIntervalPattern(UCalendarDateFields field, 1098c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& intervalPattern) { 1099c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool order = fInfo->getDefaultOrder(); 1100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(field, intervalPattern, order); 1101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1104c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 1105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::setIntervalPattern(UCalendarDateFields field, 1106c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& intervalPattern, 1107c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool laterDateFirst) { 1108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* pattern = &intervalPattern; 1109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool order = laterDateFirst; 1110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // check for "latestFirst:" or "earliestFirst:" prefix 1111c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t prefixLength = sizeof(gLaterFirstPrefix)/sizeof(gLaterFirstPrefix[0]); 1112c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t earliestFirstLength = sizeof(gEarlierFirstPrefix)/sizeof(gEarlierFirstPrefix[0]); 1113c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString realPattern; 1114c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( intervalPattern.startsWith(gLaterFirstPrefix, prefixLength) ) { 1115c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru order = true; 1116c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru intervalPattern.extract(prefixLength, 1117c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru intervalPattern.length() - prefixLength, 1118c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru realPattern); 1119c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pattern = &realPattern; 1120c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if ( intervalPattern.startsWith(gEarlierFirstPrefix, 1121c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru earliestFirstLength) ) { 1122c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru order = false; 1123c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru intervalPattern.extract(earliestFirstLength, 1124c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru intervalPattern.length() - earliestFirstLength, 1125c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru realPattern); 1126c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pattern = &realPattern; 1127c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1128c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1129c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t splitPoint = splitPatternInto2Part(*pattern); 1130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString firstPart; 1132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString secondPart; 1133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pattern->extract(0, splitPoint, firstPart); 1134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( splitPoint < pattern->length() ) { 1135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pattern->extract(splitPoint, pattern->length()-splitPoint, secondPart); 1136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setPatternInfo(field, &firstPart, &secondPart, order); 1138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/** 1144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Generate interval pattern from existing resource 1145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * It not only save the interval patterns, 1147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * but also return the extended skeleton and its best match skeleton. 1148c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1149c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param field largest different calendar field 1150c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param skeleton skeleton 1151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param bestSkeleton the best match skeleton which has interval pattern 1152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * defined in resource 1153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param differenceInfo the difference between skeleton and best skeleton 1154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 0 means the best matched skeleton is the same as input skeleton 1155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1 means the fields are the same, but field width are different 1156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 2 means the only difference between fields are v/z, 1157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * -1 means there are other fields difference 1158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 1159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param extendedSkeleton extended skeleton 1160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @param extendedBestSkeleton extended best match skeleton 1161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * @return whether the interval pattern is found 1162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * through extending skeleton or not. 1163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * TRUE if interval pattern is found by 1164c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * extending skeleton, FALSE otherwise. 1165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @stable ICU 4.0 1166c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 1167c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool 1168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::setIntervalPattern(UCalendarDateFields field, 1169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* skeleton, 1170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* bestSkeleton, 1171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t differenceInfo, 1172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString* extendedSkeleton, 1173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString* extendedBestSkeleton) { 1174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // following getIntervalPattern() should not generate error status 1176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString pattern; 1177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo->getIntervalPattern(*bestSkeleton, field, pattern, status); 1178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( pattern.isEmpty() ) { 1179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // single date 1180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( SimpleDateFormat::isFieldUnitIgnored(*bestSkeleton, field) ) { 1181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // do nothing, format will handle it 1182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return false; 1183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // for 24 hour system, interval patterns in resource file 1186c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // might not include pattern when am_pm differ, 1187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // which should be the same as hour differ. 1188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // add it here for simplicity 1189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( field == UCAL_AM_PM ) { 1190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo->getIntervalPattern(*bestSkeleton, UCAL_HOUR, pattern,status); 1191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( !pattern.isEmpty() ) { 1192c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(field, pattern); 1193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return false; 1195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // else, looking for pattern when 'y' differ for 'dMMMM' skeleton, 1197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // first, get best match pattern "MMMd", 1198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // since there is no pattern for 'y' differs for skeleton 'MMMd', 1199c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // need to look for it from skeleton 'yMMMd', 1200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // if found, adjust field width in interval pattern from 1201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // "MMM" to "MMMM". 1202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar fieldLetter = fgCalendarFieldToPatternLetter[field]; 1203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( extendedSkeleton ) { 1204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *extendedSkeleton = *skeleton; 1205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *extendedBestSkeleton = *bestSkeleton; 1206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru extendedSkeleton->insert(0, fieldLetter); 1207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru extendedBestSkeleton->insert(0, fieldLetter); 1208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // for example, looking for patterns when 'y' differ for 1209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // skeleton "MMMM". 1210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo->getIntervalPattern(*extendedBestSkeleton,field,pattern,status); 1211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( pattern.isEmpty() && differenceInfo == 0 ) { 1212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // if there is no skeleton "yMMMM" defined, 1213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // look for the best match skeleton, for example: "yMMM" 1214c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString* tmpBest = fInfo->getBestSkeleton( 1215c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *extendedBestSkeleton, differenceInfo); 1216c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( tmpBest != 0 && differenceInfo != -1 ) { 1217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo->getIntervalPattern(*tmpBest, field, pattern, status); 1218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bestSkeleton = tmpBest; 1219c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1220c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( !pattern.isEmpty() ) { 1224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( differenceInfo != 0 ) { 1225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString adjustIntervalPattern; 1226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru adjustFieldWidth(*skeleton, *bestSkeleton, pattern, differenceInfo, 1227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru adjustIntervalPattern); 1228c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(field, adjustIntervalPattern); 1229c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 1230c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(field, pattern); 1231c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1232c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( extendedSkeleton && !extendedSkeleton->isEmpty() ) { 1233c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return TRUE; 1234c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1235c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1236c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return FALSE; 1237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruint32_t U_EXPORT2 1242c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::splitPatternInto2Part(const UnicodeString& intervalPattern) { 1243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool inQuote = false; 1244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar prevCh = 0; 1245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t count = 0; 1246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1247c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* repeatedPattern used to record whether a pattern has already seen. 1248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru It is a pattern applies to first calendar if it is first time seen, 1249c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru otherwise, it is a pattern applies to the second calendar 1250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 1251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool patternRepeated[] = 1252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru { 1253c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // A B C D E F G H I J K L M N O 1254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // P Q R S T U V W X Y Z 1256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // a b c d e f g h i j k l m n o 1258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1259c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // p q r s t u v w x y z 1260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1261c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 1262c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1263c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t PATTERN_CHAR_BASE = 0x41; 1264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* loop through the pattern string character by character looking for 1266c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * the first repeated pattern letter, which breaks the interval pattern 1267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * into 2 parts. 1268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 1269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t i; 1270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool foundRepetition = false; 1271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (i = 0; i < intervalPattern.length(); ++i) { 1272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar ch = intervalPattern.charAt(i); 1273c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1274c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ch != prevCh && count > 0) { 1275c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // check the repeativeness of pattern letter 1276c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool repeated = patternRepeated[(int)(prevCh - PATTERN_CHAR_BASE)]; 1277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( repeated == FALSE ) { 1278c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru patternRepeated[prevCh - PATTERN_CHAR_BASE] = TRUE; 1279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 1280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru foundRepetition = true; 1281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 1282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru count = 0; 1284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ch == '\'') { 1286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // Consecutive single quotes are a single quote literal, 1287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // either outside of quotes or between quotes 1288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ((i+1) < intervalPattern.length() && 1289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru intervalPattern.charAt(i+1) == '\'') { 1290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++i; 1291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 1292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru inQuote = ! inQuote; 1293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1295c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else if (!inQuote && ((ch >= 0x0061 /*'a'*/ && ch <= 0x007A /*'z'*/) 1296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru || (ch >= 0x0041 /*'A'*/ && ch <= 0x005A /*'Z'*/))) { 1297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ch is a date-time pattern character 1298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru prevCh = ch; 1299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++count; 1300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // check last pattern char, distinguish 1303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // "dd MM" ( no repetition ), 1304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // "d-d"(last char repeated ), and 1305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // "d-d MM" ( repetition found ) 1306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( count > 0 && foundRepetition == FALSE ) { 1307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( patternRepeated[(int)(prevCh - PATTERN_CHAR_BASE)] == FALSE ) { 1308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru count = 0; 1309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return (i - count); 1312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1314c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic const UChar bracketedZero[] = {0x7B,0x30,0x7D}; 1315c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic const UChar bracketedOne[] = {0x7B,0x31,0x7D}; 1316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1317c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid 1318c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertDateIntervalFormat::adjustPosition(UnicodeString& combiningPattern, // has {0} and {1} in it 1319c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString& pat0, FieldPosition& pos0, // pattern and pos corresponding to {0} 1320c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString& pat1, FieldPosition& pos1, // pattern and pos corresponding to {1} 1321c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert FieldPosition& posResult) { 1322c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int32_t index0 = combiningPattern.indexOf(bracketedZero, 3, 0); 1323c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int32_t index1 = combiningPattern.indexOf(bracketedOne, 3, 0); 1324c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (index0 < 0 || index1 < 0) { 1325c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 1326c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1327c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int32_t placeholderLen = 3; // length of "{0}" or "{1}" 1328c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (index0 < index1) { 1329c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (pos0.getEndIndex() > 0) { 1330c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setBeginIndex(pos0.getBeginIndex() + index0); 1331c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setEndIndex(pos0.getEndIndex() + index0); 1332c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } else if (pos1.getEndIndex() > 0) { 1333c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // here index1 >= 3 1334c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert index1 += pat0.length() - placeholderLen; // adjust for pat0 replacing {0} 1335c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setBeginIndex(pos1.getBeginIndex() + index1); 1336c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setEndIndex(pos1.getEndIndex() + index1); 1337c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1338c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } else { 1339c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (pos1.getEndIndex() > 0) { 1340c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setBeginIndex(pos1.getBeginIndex() + index1); 1341c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setEndIndex(pos1.getEndIndex() + index1); 1342c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } else if (pos0.getEndIndex() > 0) { 1343c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // here index0 >= 3 1344c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert index0 += pat1.length() - placeholderLen; // adjust for pat1 replacing {1} 1345c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setBeginIndex(pos0.getBeginIndex() + index0); 1346c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert posResult.setEndIndex(pos0.getEndIndex() + index0); 1347c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1348c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1349c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 1350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUnicodeString& 1352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::fallbackFormat(Calendar& fromCalendar, 1353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Calendar& toCalendar, 1354c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UBool fromToOnSameDay, // new 1355c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& appendTo, 1356c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru FieldPosition& pos, 1357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) const { 1358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 1359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 1360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1361c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString fullPattern; // for saving the pattern in fDateFormat 1362c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UBool formatDatePlusTimeRange = (fromToOnSameDay && fDatePattern && fTimePattern); 1363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // the fall back 1364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // no need delete earlierDate and laterDate since they are adopted 1365c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (formatDatePlusTimeRange) { 1366c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->toPattern(fullPattern); // save current pattern, restore later 1367c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->applyPattern(*fTimePattern); 1368c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1369c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert FieldPosition otherPos; 1370c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert otherPos.setField(pos.getField()); 1371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString* earlierDate = new UnicodeString(); 1372c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->format(fromCalendar, *earlierDate, pos); 1373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString* laterDate = new UnicodeString(); 1374c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->format(toCalendar, *laterDate, otherPos); 1375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString fallbackPattern; 1376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fInfo->getFallbackIntervalPattern(fallbackPattern); 1377c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert adjustPosition(fallbackPattern, *earlierDate, pos, *laterDate, otherPos, pos); 1378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Formattable fmtArray[2]; 1379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fmtArray[0].adoptString(earlierDate); 1380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fmtArray[1].adoptString(laterDate); 1381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1382c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString fallbackRange; 1383c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert MessageFormat::format(fallbackPattern, fmtArray, 2, fallbackRange, status); 1384c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if ( U_SUCCESS(status) && formatDatePlusTimeRange ) { 1385c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // fallbackRange has just the time range, need to format the date part and combine that 1386c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->applyPattern(*fDatePattern); 1387c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString* datePortion = new UnicodeString(); 1388c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert otherPos.setBeginIndex(0); 1389c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert otherPos.setEndIndex(0); 1390c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->format(fromCalendar, *datePortion, otherPos); 1391c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert adjustPosition(*fDateTimeFormat, fallbackRange, pos, *datePortion, otherPos, pos); 1392c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fmtArray[0].setString(fallbackRange); // {0} is time range 1393c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fmtArray[1].adoptString(datePortion); // {1} is single date portion 1394c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fallbackRange.remove(); 1395c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert MessageFormat::format(*fDateTimeFormat, fmtArray, 2, fallbackRange, status); 1396c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1397c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_SUCCESS(status) ) { 1398c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert appendTo.append(fallbackRange); 1399c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1400c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (formatDatePlusTimeRange) { 1401c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // restore full pattern 1402c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert fDateFormat->applyPattern(fullPattern); 1403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return appendTo; 1405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool U_EXPORT2 1411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::fieldExistsInSkeleton(UCalendarDateFields field, 1412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& skeleton) 1413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 1414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UChar fieldChar = fgCalendarFieldToPatternLetter[field]; 1415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return ( (skeleton.indexOf(fieldChar) == -1)?FALSE:TRUE ) ; 1416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid U_EXPORT2 1421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::adjustFieldWidth(const UnicodeString& inputSkeleton, 1422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& bestMatchSkeleton, 1423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& bestIntervalPattern, 1424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t differenceInfo, 1425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& adjustedPtn) { 1426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru adjustedPtn = bestIntervalPattern; 1427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t inputSkeletonFieldWidth[] = 1428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru { 1429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // A B C D E F G H I J K L M N O 1430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // P Q R S T U V W X Y Z 1432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // a b c d e f g h i j k l m n o 1434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // p q r s t u v w x y z 1436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 1438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t bestMatchSkeletonFieldWidth[] = 1440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru { 1441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // A B C D E F G H I J K L M N O 1442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // P Q R S T U V W X Y Z 1444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // a b c d e f g h i j k l m n o 1446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // p q r s t u v w x y z 1448c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 1450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DateIntervalInfo::parseSkeleton(inputSkeleton, inputSkeletonFieldWidth); 1452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DateIntervalInfo::parseSkeleton(bestMatchSkeleton, bestMatchSkeletonFieldWidth); 1453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( differenceInfo == 2 ) { 1454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho adjustedPtn.findAndReplace(UnicodeString((UChar)0x76 /* v */), 1455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString((UChar)0x7a /* z */)); 1456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool inQuote = false; 1459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar prevCh = 0; 1460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t count = 0; 1461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const int8_t PATTERN_CHAR_BASE = 0x41; 1463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // loop through the pattern string character by character 1465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t adjustedPtnLength = adjustedPtn.length(); 1466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t i; 1467c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (i = 0; i < adjustedPtnLength; ++i) { 1468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar ch = adjustedPtn.charAt(i); 1469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ch != prevCh && count > 0) { 1470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // check the repeativeness of pattern letter 1471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar skeletonChar = prevCh; 1472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( skeletonChar == CAP_L ) { 1473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // there is no "L" (always be "M") in skeleton, 1474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // but there is "L" in pattern. 1475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // for skeleton "M+", the pattern might be "...L..." 1476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeletonChar = CAP_M; 1477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t fieldCount = bestMatchSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; 1479c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t inputFieldCount = inputSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; 1480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( fieldCount == count && inputFieldCount > fieldCount ) { 1481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru count = inputFieldCount - fieldCount; 1482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t j; 1483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for ( j = 0; j < count; ++j ) { 1484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru adjustedPtn.insert(i, prevCh); 1485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru i += count; 1487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru adjustedPtnLength += count; 1488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru count = 0; 1490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ch == '\'') { 1492c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // Consecutive single quotes are a single quote literal, 1493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // either outside of quotes or between quotes 1494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ((i+1) < adjustedPtn.length() && adjustedPtn.charAt(i+1) == '\'') { 1495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++i; 1496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 1497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru inQuote = ! inQuote; 1498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1499c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1500c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else if ( ! inQuote && ((ch >= 0x0061 /*'a'*/ && ch <= 0x007A /*'z'*/) 1501c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru || (ch >= 0x0041 /*'A'*/ && ch <= 0x005A /*'Z'*/))) { 1502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ch is a date-time pattern character 1503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru prevCh = ch; 1504c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ++count; 1505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1507c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( count > 0 ) { 1508c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // last item 1509c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // check the repeativeness of pattern letter 1510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar skeletonChar = prevCh; 1511c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( skeletonChar == CAP_L ) { 1512c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // there is no "L" (always be "M") in skeleton, 1513c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // but there is "L" in pattern. 1514c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // for skeleton "M+", the pattern might be "...L..." 1515c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru skeletonChar = CAP_M; 1516c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1517c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t fieldCount = bestMatchSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; 1518c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t inputFieldCount = inputSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; 1519c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( fieldCount == count && inputFieldCount > fieldCount ) { 1520c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru count = inputFieldCount - fieldCount; 1521c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t j; 1522c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for ( j = 0; j < count; ++j ) { 1523c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru adjustedPtn.append(prevCh); 1524c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1528c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1529c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1530c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1531c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 1532c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertDateIntervalFormat::concatSingleDate2TimeInterval(UnicodeString& format, 1533c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString& datePattern, 1534c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UCalendarDateFields field, 1535c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode& status) { 1536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // following should not set wrong status 1537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t itvPtnIndex = DateIntervalInfo::calendarFieldToIntervalIndex(field, 1538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status); 1539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 1540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 1541c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PatternInfo& timeItvPtnInfo = fIntervalPatterns[itvPtnIndex]; 1543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( !timeItvPtnInfo.firstPart.isEmpty() ) { 1544c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // UnicodeString allocated here is adopted, so no need to delete 1545c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString* timeIntervalPattern = new UnicodeString(timeItvPtnInfo.firstPart); 1546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru timeIntervalPattern->append(timeItvPtnInfo.secondPart); 1547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString* dateStr = new UnicodeString(datePattern); 1548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Formattable fmtArray[2]; 1549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fmtArray[0].adoptString(timeIntervalPattern); 1550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fmtArray[1].adoptString(dateStr); 1551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString combinedPattern; 1552c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert MessageFormat::format(format, fmtArray, 2, combinedPattern, status); 1553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_FAILURE(status) ) { 1554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 1555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru setIntervalPattern(field, combinedPattern, timeItvPtnInfo.laterDateFirst); 1557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // else: fall back 1559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // it should not happen if the interval format defined is valid 1560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst UChar 1565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruDateIntervalFormat::fgCalendarFieldToPatternLetter[] = 1566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 1567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /*GyM*/ CAP_G, LOW_Y, CAP_M, 1568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /*wWd*/ LOW_W, CAP_W, LOW_D, 1569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /*DEF*/ CAP_D, CAP_E, CAP_F, 1570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /*ahH*/ LOW_A, LOW_H, CAP_H, 1571fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /*msS*/ LOW_M, LOW_S, CAP_S, // MINUTE, SECOND, MILLISECOND 1572fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /*z.Y*/ LOW_Z, SPACE, CAP_Y, // ZONE_OFFSET, DST_OFFSET, YEAR_WOY, 1573fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /*eug*/ LOW_E, LOW_U, LOW_G, // DOW_LOCAL, EXTENDED_YEAR, JULIAN_DAY, 1574fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius /*A..*/ CAP_A, SPACE, SPACE, // MILLISECONDS_IN_DAY, IS_LEAP_MONTH, FIELD_COUNT 1575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}; 1576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_NAMESPACE_END 1579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif 1581