1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ***************************************************************************** 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2014-2016, International Business Machines Corporation and 6*0e209d39SAndroid Build Coastguard Worker * others. 7*0e209d39SAndroid Build Coastguard Worker * All Rights Reserved. 8*0e209d39SAndroid Build Coastguard Worker ***************************************************************************** 9*0e209d39SAndroid Build Coastguard Worker * 10*0e209d39SAndroid Build Coastguard Worker * File RELDATEFMT.H 11*0e209d39SAndroid Build Coastguard Worker ***************************************************************************** 12*0e209d39SAndroid Build Coastguard Worker */ 13*0e209d39SAndroid Build Coastguard Worker 14*0e209d39SAndroid Build Coastguard Worker #ifndef __RELDATEFMT_H 15*0e209d39SAndroid Build Coastguard Worker #define __RELDATEFMT_H 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 18*0e209d39SAndroid Build Coastguard Worker 19*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker #include "unicode/uobject.h" 22*0e209d39SAndroid Build Coastguard Worker #include "unicode/udisplaycontext.h" 23*0e209d39SAndroid Build Coastguard Worker #include "unicode/ureldatefmt.h" 24*0e209d39SAndroid Build Coastguard Worker #include "unicode/locid.h" 25*0e209d39SAndroid Build Coastguard Worker #include "unicode/formattedvalue.h" 26*0e209d39SAndroid Build Coastguard Worker 27*0e209d39SAndroid Build Coastguard Worker /** 28*0e209d39SAndroid Build Coastguard Worker * \file 29*0e209d39SAndroid Build Coastguard Worker * \brief C++ API: Formats relative dates such as "1 day ago" or "tomorrow" 30*0e209d39SAndroid Build Coastguard Worker */ 31*0e209d39SAndroid Build Coastguard Worker 32*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 33*0e209d39SAndroid Build Coastguard Worker 34*0e209d39SAndroid Build Coastguard Worker /** 35*0e209d39SAndroid Build Coastguard Worker * Represents the unit for formatting a relative date. e.g "in 5 days" 36*0e209d39SAndroid Build Coastguard Worker * or "in 3 months" 37*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 38*0e209d39SAndroid Build Coastguard Worker */ 39*0e209d39SAndroid Build Coastguard Worker typedef enum UDateRelativeUnit { 40*0e209d39SAndroid Build Coastguard Worker 41*0e209d39SAndroid Build Coastguard Worker /** 42*0e209d39SAndroid Build Coastguard Worker * Seconds 43*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 44*0e209d39SAndroid Build Coastguard Worker */ 45*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_SECONDS, 46*0e209d39SAndroid Build Coastguard Worker 47*0e209d39SAndroid Build Coastguard Worker /** 48*0e209d39SAndroid Build Coastguard Worker * Minutes 49*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 50*0e209d39SAndroid Build Coastguard Worker */ 51*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_MINUTES, 52*0e209d39SAndroid Build Coastguard Worker 53*0e209d39SAndroid Build Coastguard Worker /** 54*0e209d39SAndroid Build Coastguard Worker * Hours 55*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 56*0e209d39SAndroid Build Coastguard Worker */ 57*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_HOURS, 58*0e209d39SAndroid Build Coastguard Worker 59*0e209d39SAndroid Build Coastguard Worker /** 60*0e209d39SAndroid Build Coastguard Worker * Days 61*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 62*0e209d39SAndroid Build Coastguard Worker */ 63*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_DAYS, 64*0e209d39SAndroid Build Coastguard Worker 65*0e209d39SAndroid Build Coastguard Worker /** 66*0e209d39SAndroid Build Coastguard Worker * Weeks 67*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 68*0e209d39SAndroid Build Coastguard Worker */ 69*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_WEEKS, 70*0e209d39SAndroid Build Coastguard Worker 71*0e209d39SAndroid Build Coastguard Worker /** 72*0e209d39SAndroid Build Coastguard Worker * Months 73*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 74*0e209d39SAndroid Build Coastguard Worker */ 75*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_MONTHS, 76*0e209d39SAndroid Build Coastguard Worker 77*0e209d39SAndroid Build Coastguard Worker /** 78*0e209d39SAndroid Build Coastguard Worker * Years 79*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 80*0e209d39SAndroid Build Coastguard Worker */ 81*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_YEARS, 82*0e209d39SAndroid Build Coastguard Worker 83*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_DEPRECATED_API 84*0e209d39SAndroid Build Coastguard Worker /** 85*0e209d39SAndroid Build Coastguard Worker * One more than the highest normal UDateRelativeUnit value. 86*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. 87*0e209d39SAndroid Build Coastguard Worker */ 88*0e209d39SAndroid Build Coastguard Worker UDAT_RELATIVE_UNIT_COUNT 89*0e209d39SAndroid Build Coastguard Worker #endif // U_HIDE_DEPRECATED_API 90*0e209d39SAndroid Build Coastguard Worker } UDateRelativeUnit; 91*0e209d39SAndroid Build Coastguard Worker 92*0e209d39SAndroid Build Coastguard Worker /** 93*0e209d39SAndroid Build Coastguard Worker * Represents an absolute unit. 94*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 95*0e209d39SAndroid Build Coastguard Worker */ 96*0e209d39SAndroid Build Coastguard Worker typedef enum UDateAbsoluteUnit { 97*0e209d39SAndroid Build Coastguard Worker 98*0e209d39SAndroid Build Coastguard Worker // Days of week have to remain together and in order from Sunday to 99*0e209d39SAndroid Build Coastguard Worker // Saturday. 100*0e209d39SAndroid Build Coastguard Worker /** 101*0e209d39SAndroid Build Coastguard Worker * Sunday 102*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 103*0e209d39SAndroid Build Coastguard Worker */ 104*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_SUNDAY, 105*0e209d39SAndroid Build Coastguard Worker 106*0e209d39SAndroid Build Coastguard Worker /** 107*0e209d39SAndroid Build Coastguard Worker * Monday 108*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 109*0e209d39SAndroid Build Coastguard Worker */ 110*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_MONDAY, 111*0e209d39SAndroid Build Coastguard Worker 112*0e209d39SAndroid Build Coastguard Worker /** 113*0e209d39SAndroid Build Coastguard Worker * Tuesday 114*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 115*0e209d39SAndroid Build Coastguard Worker */ 116*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_TUESDAY, 117*0e209d39SAndroid Build Coastguard Worker 118*0e209d39SAndroid Build Coastguard Worker /** 119*0e209d39SAndroid Build Coastguard Worker * Wednesday 120*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 121*0e209d39SAndroid Build Coastguard Worker */ 122*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_WEDNESDAY, 123*0e209d39SAndroid Build Coastguard Worker 124*0e209d39SAndroid Build Coastguard Worker /** 125*0e209d39SAndroid Build Coastguard Worker * Thursday 126*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 127*0e209d39SAndroid Build Coastguard Worker */ 128*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_THURSDAY, 129*0e209d39SAndroid Build Coastguard Worker 130*0e209d39SAndroid Build Coastguard Worker /** 131*0e209d39SAndroid Build Coastguard Worker * Friday 132*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 133*0e209d39SAndroid Build Coastguard Worker */ 134*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_FRIDAY, 135*0e209d39SAndroid Build Coastguard Worker 136*0e209d39SAndroid Build Coastguard Worker /** 137*0e209d39SAndroid Build Coastguard Worker * Saturday 138*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 139*0e209d39SAndroid Build Coastguard Worker */ 140*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_SATURDAY, 141*0e209d39SAndroid Build Coastguard Worker 142*0e209d39SAndroid Build Coastguard Worker /** 143*0e209d39SAndroid Build Coastguard Worker * Day 144*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 145*0e209d39SAndroid Build Coastguard Worker */ 146*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_DAY, 147*0e209d39SAndroid Build Coastguard Worker 148*0e209d39SAndroid Build Coastguard Worker /** 149*0e209d39SAndroid Build Coastguard Worker * Week 150*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 151*0e209d39SAndroid Build Coastguard Worker */ 152*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_WEEK, 153*0e209d39SAndroid Build Coastguard Worker 154*0e209d39SAndroid Build Coastguard Worker /** 155*0e209d39SAndroid Build Coastguard Worker * Month 156*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 157*0e209d39SAndroid Build Coastguard Worker */ 158*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_MONTH, 159*0e209d39SAndroid Build Coastguard Worker 160*0e209d39SAndroid Build Coastguard Worker /** 161*0e209d39SAndroid Build Coastguard Worker * Year 162*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 163*0e209d39SAndroid Build Coastguard Worker */ 164*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_YEAR, 165*0e209d39SAndroid Build Coastguard Worker 166*0e209d39SAndroid Build Coastguard Worker /** 167*0e209d39SAndroid Build Coastguard Worker * Now 168*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 169*0e209d39SAndroid Build Coastguard Worker */ 170*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_NOW, 171*0e209d39SAndroid Build Coastguard Worker 172*0e209d39SAndroid Build Coastguard Worker /** 173*0e209d39SAndroid Build Coastguard Worker * Quarter 174*0e209d39SAndroid Build Coastguard Worker * @stable ICU 63 175*0e209d39SAndroid Build Coastguard Worker */ 176*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_QUARTER, 177*0e209d39SAndroid Build Coastguard Worker 178*0e209d39SAndroid Build Coastguard Worker /** 179*0e209d39SAndroid Build Coastguard Worker * Hour 180*0e209d39SAndroid Build Coastguard Worker * @stable ICU 65 181*0e209d39SAndroid Build Coastguard Worker */ 182*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_HOUR, 183*0e209d39SAndroid Build Coastguard Worker 184*0e209d39SAndroid Build Coastguard Worker /** 185*0e209d39SAndroid Build Coastguard Worker * Minute 186*0e209d39SAndroid Build Coastguard Worker * @stable ICU 65 187*0e209d39SAndroid Build Coastguard Worker */ 188*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_MINUTE, 189*0e209d39SAndroid Build Coastguard Worker 190*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_DEPRECATED_API 191*0e209d39SAndroid Build Coastguard Worker /** 192*0e209d39SAndroid Build Coastguard Worker * One more than the highest normal UDateAbsoluteUnit value. 193*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. 194*0e209d39SAndroid Build Coastguard Worker */ 195*0e209d39SAndroid Build Coastguard Worker UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4 196*0e209d39SAndroid Build Coastguard Worker #endif // U_HIDE_DEPRECATED_API 197*0e209d39SAndroid Build Coastguard Worker } UDateAbsoluteUnit; 198*0e209d39SAndroid Build Coastguard Worker 199*0e209d39SAndroid Build Coastguard Worker /** 200*0e209d39SAndroid Build Coastguard Worker * Represents a direction for an absolute unit e.g "Next Tuesday" 201*0e209d39SAndroid Build Coastguard Worker * or "Last Tuesday" 202*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 203*0e209d39SAndroid Build Coastguard Worker */ 204*0e209d39SAndroid Build Coastguard Worker typedef enum UDateDirection { 205*0e209d39SAndroid Build Coastguard Worker 206*0e209d39SAndroid Build Coastguard Worker /** 207*0e209d39SAndroid Build Coastguard Worker * Two before. Not fully supported in every locale. 208*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 209*0e209d39SAndroid Build Coastguard Worker */ 210*0e209d39SAndroid Build Coastguard Worker UDAT_DIRECTION_LAST_2, 211*0e209d39SAndroid Build Coastguard Worker 212*0e209d39SAndroid Build Coastguard Worker /** 213*0e209d39SAndroid Build Coastguard Worker * Last 214*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 215*0e209d39SAndroid Build Coastguard Worker */ 216*0e209d39SAndroid Build Coastguard Worker UDAT_DIRECTION_LAST, 217*0e209d39SAndroid Build Coastguard Worker 218*0e209d39SAndroid Build Coastguard Worker /** 219*0e209d39SAndroid Build Coastguard Worker * This 220*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 221*0e209d39SAndroid Build Coastguard Worker */ 222*0e209d39SAndroid Build Coastguard Worker UDAT_DIRECTION_THIS, 223*0e209d39SAndroid Build Coastguard Worker 224*0e209d39SAndroid Build Coastguard Worker /** 225*0e209d39SAndroid Build Coastguard Worker * Next 226*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 227*0e209d39SAndroid Build Coastguard Worker */ 228*0e209d39SAndroid Build Coastguard Worker UDAT_DIRECTION_NEXT, 229*0e209d39SAndroid Build Coastguard Worker 230*0e209d39SAndroid Build Coastguard Worker /** 231*0e209d39SAndroid Build Coastguard Worker * Two after. Not fully supported in every locale. 232*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 233*0e209d39SAndroid Build Coastguard Worker */ 234*0e209d39SAndroid Build Coastguard Worker UDAT_DIRECTION_NEXT_2, 235*0e209d39SAndroid Build Coastguard Worker 236*0e209d39SAndroid Build Coastguard Worker /** 237*0e209d39SAndroid Build Coastguard Worker * Plain, which means the absence of a qualifier. 238*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 239*0e209d39SAndroid Build Coastguard Worker */ 240*0e209d39SAndroid Build Coastguard Worker UDAT_DIRECTION_PLAIN, 241*0e209d39SAndroid Build Coastguard Worker 242*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_DEPRECATED_API 243*0e209d39SAndroid Build Coastguard Worker /** 244*0e209d39SAndroid Build Coastguard Worker * One more than the highest normal UDateDirection value. 245*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. 246*0e209d39SAndroid Build Coastguard Worker */ 247*0e209d39SAndroid Build Coastguard Worker UDAT_DIRECTION_COUNT 248*0e209d39SAndroid Build Coastguard Worker #endif // U_HIDE_DEPRECATED_API 249*0e209d39SAndroid Build Coastguard Worker } UDateDirection; 250*0e209d39SAndroid Build Coastguard Worker 251*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 252*0e209d39SAndroid Build Coastguard Worker 253*0e209d39SAndroid Build Coastguard Worker class BreakIterator; 254*0e209d39SAndroid Build Coastguard Worker class RelativeDateTimeCacheData; 255*0e209d39SAndroid Build Coastguard Worker class SharedNumberFormat; 256*0e209d39SAndroid Build Coastguard Worker class SharedPluralRules; 257*0e209d39SAndroid Build Coastguard Worker class SharedBreakIterator; 258*0e209d39SAndroid Build Coastguard Worker class NumberFormat; 259*0e209d39SAndroid Build Coastguard Worker class UnicodeString; 260*0e209d39SAndroid Build Coastguard Worker class FormattedRelativeDateTime; 261*0e209d39SAndroid Build Coastguard Worker class FormattedRelativeDateTimeData; 262*0e209d39SAndroid Build Coastguard Worker 263*0e209d39SAndroid Build Coastguard Worker /** 264*0e209d39SAndroid Build Coastguard Worker * An immutable class containing the result of a relative datetime formatting operation. 265*0e209d39SAndroid Build Coastguard Worker * 266*0e209d39SAndroid Build Coastguard Worker * Instances of this class are immutable and thread-safe. 267*0e209d39SAndroid Build Coastguard Worker * 268*0e209d39SAndroid Build Coastguard Worker * Not intended for public subclassing. 269*0e209d39SAndroid Build Coastguard Worker * 270*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 271*0e209d39SAndroid Build Coastguard Worker */ 272*0e209d39SAndroid Build Coastguard Worker class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue { 273*0e209d39SAndroid Build Coastguard Worker public: 274*0e209d39SAndroid Build Coastguard Worker /** 275*0e209d39SAndroid Build Coastguard Worker * Default constructor; makes an empty FormattedRelativeDateTime. 276*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 277*0e209d39SAndroid Build Coastguard Worker */ FormattedRelativeDateTime()278*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {} 279*0e209d39SAndroid Build Coastguard Worker 280*0e209d39SAndroid Build Coastguard Worker /** 281*0e209d39SAndroid Build Coastguard Worker * Move constructor: Leaves the source FormattedRelativeDateTime in an undefined state. 282*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 283*0e209d39SAndroid Build Coastguard Worker */ 284*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime(FormattedRelativeDateTime&& src) noexcept; 285*0e209d39SAndroid Build Coastguard Worker 286*0e209d39SAndroid Build Coastguard Worker /** 287*0e209d39SAndroid Build Coastguard Worker * Destruct an instance of FormattedRelativeDateTime. 288*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 289*0e209d39SAndroid Build Coastguard Worker */ 290*0e209d39SAndroid Build Coastguard Worker virtual ~FormattedRelativeDateTime() override; 291*0e209d39SAndroid Build Coastguard Worker 292*0e209d39SAndroid Build Coastguard Worker /** Copying not supported; use move constructor instead. */ 293*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete; 294*0e209d39SAndroid Build Coastguard Worker 295*0e209d39SAndroid Build Coastguard Worker /** Copying not supported; use move assignment instead. */ 296*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete; 297*0e209d39SAndroid Build Coastguard Worker 298*0e209d39SAndroid Build Coastguard Worker /** 299*0e209d39SAndroid Build Coastguard Worker * Move assignment: Leaves the source FormattedRelativeDateTime in an undefined state. 300*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 301*0e209d39SAndroid Build Coastguard Worker */ 302*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) noexcept; 303*0e209d39SAndroid Build Coastguard Worker 304*0e209d39SAndroid Build Coastguard Worker /** @copydoc FormattedValue::toString() */ 305*0e209d39SAndroid Build Coastguard Worker UnicodeString toString(UErrorCode& status) const override; 306*0e209d39SAndroid Build Coastguard Worker 307*0e209d39SAndroid Build Coastguard Worker /** @copydoc FormattedValue::toTempString() */ 308*0e209d39SAndroid Build Coastguard Worker UnicodeString toTempString(UErrorCode& status) const override; 309*0e209d39SAndroid Build Coastguard Worker 310*0e209d39SAndroid Build Coastguard Worker /** @copydoc FormattedValue::appendTo() */ 311*0e209d39SAndroid Build Coastguard Worker Appendable &appendTo(Appendable& appendable, UErrorCode& status) const override; 312*0e209d39SAndroid Build Coastguard Worker 313*0e209d39SAndroid Build Coastguard Worker /** @copydoc FormattedValue::nextPosition() */ 314*0e209d39SAndroid Build Coastguard Worker UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override; 315*0e209d39SAndroid Build Coastguard Worker 316*0e209d39SAndroid Build Coastguard Worker private: 317*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTimeData *fData; 318*0e209d39SAndroid Build Coastguard Worker UErrorCode fErrorCode; FormattedRelativeDateTime(FormattedRelativeDateTimeData * results)319*0e209d39SAndroid Build Coastguard Worker explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results) 320*0e209d39SAndroid Build Coastguard Worker : fData(results), fErrorCode(U_ZERO_ERROR) {} FormattedRelativeDateTime(UErrorCode errorCode)321*0e209d39SAndroid Build Coastguard Worker explicit FormattedRelativeDateTime(UErrorCode errorCode) 322*0e209d39SAndroid Build Coastguard Worker : fData(nullptr), fErrorCode(errorCode) {} 323*0e209d39SAndroid Build Coastguard Worker friend class RelativeDateTimeFormatter; 324*0e209d39SAndroid Build Coastguard Worker }; 325*0e209d39SAndroid Build Coastguard Worker 326*0e209d39SAndroid Build Coastguard Worker /** 327*0e209d39SAndroid Build Coastguard Worker * Formats simple relative dates. There are two types of relative dates that 328*0e209d39SAndroid Build Coastguard Worker * it handles: 329*0e209d39SAndroid Build Coastguard Worker * <ul> 330*0e209d39SAndroid Build Coastguard Worker * <li>relative dates with a quantity e.g "in 5 days"</li> 331*0e209d39SAndroid Build Coastguard Worker * <li>relative dates without a quantity e.g "next Tuesday"</li> 332*0e209d39SAndroid Build Coastguard Worker * </ul> 333*0e209d39SAndroid Build Coastguard Worker * <p> 334*0e209d39SAndroid Build Coastguard Worker * This API is very basic and is intended to be a building block for more 335*0e209d39SAndroid Build Coastguard Worker * fancy APIs. The caller tells it exactly what to display in a locale 336*0e209d39SAndroid Build Coastguard Worker * independent way. While this class automatically provides the correct plural 337*0e209d39SAndroid Build Coastguard Worker * forms, the grammatical form is otherwise as neutral as possible. It is the 338*0e209d39SAndroid Build Coastguard Worker * caller's responsibility to handle cut-off logic such as deciding between 339*0e209d39SAndroid Build Coastguard Worker * displaying "in 7 days" or "in 1 week." This API supports relative dates 340*0e209d39SAndroid Build Coastguard Worker * involving one single unit. This API does not support relative dates 341*0e209d39SAndroid Build Coastguard Worker * involving compound units, 342*0e209d39SAndroid Build Coastguard Worker * e.g "in 5 days and 4 hours" nor does it support parsing. 343*0e209d39SAndroid Build Coastguard Worker * <p> 344*0e209d39SAndroid Build Coastguard Worker * This class is mostly thread safe and immutable with the following caveats: 345*0e209d39SAndroid Build Coastguard Worker * 1. The assignment operator violates Immutability. It must not be used 346*0e209d39SAndroid Build Coastguard Worker * concurrently with other operations. 347*0e209d39SAndroid Build Coastguard Worker * 2. Caller must not hold onto adopted pointers. 348*0e209d39SAndroid Build Coastguard Worker * <p> 349*0e209d39SAndroid Build Coastguard Worker * This class is not intended for public subclassing. 350*0e209d39SAndroid Build Coastguard Worker * <p> 351*0e209d39SAndroid Build Coastguard Worker * Here are some examples of use: 352*0e209d39SAndroid Build Coastguard Worker * <blockquote> 353*0e209d39SAndroid Build Coastguard Worker * <pre> 354*0e209d39SAndroid Build Coastguard Worker * UErrorCode status = U_ZERO_ERROR; 355*0e209d39SAndroid Build Coastguard Worker * UnicodeString appendTo; 356*0e209d39SAndroid Build Coastguard Worker * RelativeDateTimeFormatter fmt(status); 357*0e209d39SAndroid Build Coastguard Worker * // Appends "in 1 day" 358*0e209d39SAndroid Build Coastguard Worker * fmt.format( 359*0e209d39SAndroid Build Coastguard Worker * 1, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status); 360*0e209d39SAndroid Build Coastguard Worker * // Appends "in 3 days" 361*0e209d39SAndroid Build Coastguard Worker * fmt.format( 362*0e209d39SAndroid Build Coastguard Worker * 3, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status); 363*0e209d39SAndroid Build Coastguard Worker * // Appends "3.2 years ago" 364*0e209d39SAndroid Build Coastguard Worker * fmt.format( 365*0e209d39SAndroid Build Coastguard Worker * 3.2, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, appendTo, status); 366*0e209d39SAndroid Build Coastguard Worker * // Appends "last Sunday" 367*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, appendTo, status); 368*0e209d39SAndroid Build Coastguard Worker * // Appends "this Sunday" 369*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, appendTo, status); 370*0e209d39SAndroid Build Coastguard Worker * // Appends "next Sunday" 371*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, appendTo, status); 372*0e209d39SAndroid Build Coastguard Worker * // Appends "Sunday" 373*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, appendTo, status); 374*0e209d39SAndroid Build Coastguard Worker * 375*0e209d39SAndroid Build Coastguard Worker * // Appends "yesterday" 376*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, appendTo, status); 377*0e209d39SAndroid Build Coastguard Worker * // Appends "today" 378*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, appendTo, status); 379*0e209d39SAndroid Build Coastguard Worker * // Appends "tomorrow" 380*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, appendTo, status); 381*0e209d39SAndroid Build Coastguard Worker * // Appends "now" 382*0e209d39SAndroid Build Coastguard Worker * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, appendTo, status); 383*0e209d39SAndroid Build Coastguard Worker * 384*0e209d39SAndroid Build Coastguard Worker * </pre> 385*0e209d39SAndroid Build Coastguard Worker * </blockquote> 386*0e209d39SAndroid Build Coastguard Worker * <p> 387*0e209d39SAndroid Build Coastguard Worker * In the future, we may add more forms, such as abbreviated/short forms 388*0e209d39SAndroid Build Coastguard Worker * (3 secs ago), and relative day periods ("yesterday afternoon"), etc. 389*0e209d39SAndroid Build Coastguard Worker * 390*0e209d39SAndroid Build Coastguard Worker * The RelativeDateTimeFormatter class is not intended for public subclassing. 391*0e209d39SAndroid Build Coastguard Worker * 392*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 393*0e209d39SAndroid Build Coastguard Worker */ 394*0e209d39SAndroid Build Coastguard Worker class U_I18N_API RelativeDateTimeFormatter : public UObject { 395*0e209d39SAndroid Build Coastguard Worker public: 396*0e209d39SAndroid Build Coastguard Worker 397*0e209d39SAndroid Build Coastguard Worker /** 398*0e209d39SAndroid Build Coastguard Worker * Create RelativeDateTimeFormatter with default locale. 399*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 400*0e209d39SAndroid Build Coastguard Worker */ 401*0e209d39SAndroid Build Coastguard Worker RelativeDateTimeFormatter(UErrorCode& status); 402*0e209d39SAndroid Build Coastguard Worker 403*0e209d39SAndroid Build Coastguard Worker /** 404*0e209d39SAndroid Build Coastguard Worker * Create RelativeDateTimeFormatter with given locale. 405*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 406*0e209d39SAndroid Build Coastguard Worker */ 407*0e209d39SAndroid Build Coastguard Worker RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status); 408*0e209d39SAndroid Build Coastguard Worker 409*0e209d39SAndroid Build Coastguard Worker /** 410*0e209d39SAndroid Build Coastguard Worker * Create RelativeDateTimeFormatter with given locale and NumberFormat. 411*0e209d39SAndroid Build Coastguard Worker * 412*0e209d39SAndroid Build Coastguard Worker * @param locale the locale 413*0e209d39SAndroid Build Coastguard Worker * @param nfToAdopt Constructed object takes ownership of this pointer. 414*0e209d39SAndroid Build Coastguard Worker * It is an error for caller to delete this pointer or change its 415*0e209d39SAndroid Build Coastguard Worker * contents after calling this constructor. 416*0e209d39SAndroid Build Coastguard Worker * @param status Any error is returned here. 417*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 418*0e209d39SAndroid Build Coastguard Worker */ 419*0e209d39SAndroid Build Coastguard Worker RelativeDateTimeFormatter( 420*0e209d39SAndroid Build Coastguard Worker const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status); 421*0e209d39SAndroid Build Coastguard Worker 422*0e209d39SAndroid Build Coastguard Worker /** 423*0e209d39SAndroid Build Coastguard Worker * Create RelativeDateTimeFormatter with given locale, NumberFormat, 424*0e209d39SAndroid Build Coastguard Worker * and capitalization context. 425*0e209d39SAndroid Build Coastguard Worker * 426*0e209d39SAndroid Build Coastguard Worker * @param locale the locale 427*0e209d39SAndroid Build Coastguard Worker * @param nfToAdopt Constructed object takes ownership of this pointer. 428*0e209d39SAndroid Build Coastguard Worker * It is an error for caller to delete this pointer or change its 429*0e209d39SAndroid Build Coastguard Worker * contents after calling this constructor. Caller may pass nullptr for 430*0e209d39SAndroid Build Coastguard Worker * this argument if they want default number format behavior. 431*0e209d39SAndroid Build Coastguard Worker * @param style the format style. The UDAT_RELATIVE bit field has no effect. 432*0e209d39SAndroid Build Coastguard Worker * @param capitalizationContext A value from UDisplayContext that pertains to 433*0e209d39SAndroid Build Coastguard Worker * capitalization. 434*0e209d39SAndroid Build Coastguard Worker * @param status Any error is returned here. 435*0e209d39SAndroid Build Coastguard Worker * @stable ICU 54 436*0e209d39SAndroid Build Coastguard Worker */ 437*0e209d39SAndroid Build Coastguard Worker RelativeDateTimeFormatter( 438*0e209d39SAndroid Build Coastguard Worker const Locale& locale, 439*0e209d39SAndroid Build Coastguard Worker NumberFormat *nfToAdopt, 440*0e209d39SAndroid Build Coastguard Worker UDateRelativeDateTimeFormatterStyle style, 441*0e209d39SAndroid Build Coastguard Worker UDisplayContext capitalizationContext, 442*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 443*0e209d39SAndroid Build Coastguard Worker 444*0e209d39SAndroid Build Coastguard Worker /** 445*0e209d39SAndroid Build Coastguard Worker * Copy constructor. 446*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 447*0e209d39SAndroid Build Coastguard Worker */ 448*0e209d39SAndroid Build Coastguard Worker RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other); 449*0e209d39SAndroid Build Coastguard Worker 450*0e209d39SAndroid Build Coastguard Worker /** 451*0e209d39SAndroid Build Coastguard Worker * Assignment operator. 452*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 453*0e209d39SAndroid Build Coastguard Worker */ 454*0e209d39SAndroid Build Coastguard Worker RelativeDateTimeFormatter& operator=( 455*0e209d39SAndroid Build Coastguard Worker const RelativeDateTimeFormatter& other); 456*0e209d39SAndroid Build Coastguard Worker 457*0e209d39SAndroid Build Coastguard Worker /** 458*0e209d39SAndroid Build Coastguard Worker * Destructor. 459*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 460*0e209d39SAndroid Build Coastguard Worker */ 461*0e209d39SAndroid Build Coastguard Worker virtual ~RelativeDateTimeFormatter(); 462*0e209d39SAndroid Build Coastguard Worker 463*0e209d39SAndroid Build Coastguard Worker /** 464*0e209d39SAndroid Build Coastguard Worker * Formats a relative date with a quantity such as "in 5 days" or 465*0e209d39SAndroid Build Coastguard Worker * "3 months ago" 466*0e209d39SAndroid Build Coastguard Worker * 467*0e209d39SAndroid Build Coastguard Worker * This method returns a String. To get more information about the 468*0e209d39SAndroid Build Coastguard Worker * formatting result, use formatToValue(). 469*0e209d39SAndroid Build Coastguard Worker * 470*0e209d39SAndroid Build Coastguard Worker * @param quantity The numerical amount e.g 5. This value is formatted 471*0e209d39SAndroid Build Coastguard Worker * according to this object's NumberFormat object. 472*0e209d39SAndroid Build Coastguard Worker * @param direction NEXT means a future relative date; LAST means a past 473*0e209d39SAndroid Build Coastguard Worker * relative date. If direction is anything else, this method sets 474*0e209d39SAndroid Build Coastguard Worker * status to U_ILLEGAL_ARGUMENT_ERROR. 475*0e209d39SAndroid Build Coastguard Worker * @param unit the unit e.g day? month? year? 476*0e209d39SAndroid Build Coastguard Worker * @param appendTo The string to which the formatted result will be 477*0e209d39SAndroid Build Coastguard Worker * appended 478*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 479*0e209d39SAndroid Build Coastguard Worker * @return appendTo 480*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 481*0e209d39SAndroid Build Coastguard Worker */ 482*0e209d39SAndroid Build Coastguard Worker UnicodeString& format( 483*0e209d39SAndroid Build Coastguard Worker double quantity, 484*0e209d39SAndroid Build Coastguard Worker UDateDirection direction, 485*0e209d39SAndroid Build Coastguard Worker UDateRelativeUnit unit, 486*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 487*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 488*0e209d39SAndroid Build Coastguard Worker 489*0e209d39SAndroid Build Coastguard Worker /** 490*0e209d39SAndroid Build Coastguard Worker * Formats a relative date with a quantity such as "in 5 days" or 491*0e209d39SAndroid Build Coastguard Worker * "3 months ago" 492*0e209d39SAndroid Build Coastguard Worker * 493*0e209d39SAndroid Build Coastguard Worker * This method returns a FormattedRelativeDateTime, which exposes more 494*0e209d39SAndroid Build Coastguard Worker * information than the String returned by format(). 495*0e209d39SAndroid Build Coastguard Worker * 496*0e209d39SAndroid Build Coastguard Worker * @param quantity The numerical amount e.g 5. This value is formatted 497*0e209d39SAndroid Build Coastguard Worker * according to this object's NumberFormat object. 498*0e209d39SAndroid Build Coastguard Worker * @param direction NEXT means a future relative date; LAST means a past 499*0e209d39SAndroid Build Coastguard Worker * relative date. If direction is anything else, this method sets 500*0e209d39SAndroid Build Coastguard Worker * status to U_ILLEGAL_ARGUMENT_ERROR. 501*0e209d39SAndroid Build Coastguard Worker * @param unit the unit e.g day? month? year? 502*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 503*0e209d39SAndroid Build Coastguard Worker * @return The formatted relative datetime 504*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 505*0e209d39SAndroid Build Coastguard Worker */ 506*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime formatToValue( 507*0e209d39SAndroid Build Coastguard Worker double quantity, 508*0e209d39SAndroid Build Coastguard Worker UDateDirection direction, 509*0e209d39SAndroid Build Coastguard Worker UDateRelativeUnit unit, 510*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 511*0e209d39SAndroid Build Coastguard Worker 512*0e209d39SAndroid Build Coastguard Worker /** 513*0e209d39SAndroid Build Coastguard Worker * Formats a relative date without a quantity. 514*0e209d39SAndroid Build Coastguard Worker * 515*0e209d39SAndroid Build Coastguard Worker * This method returns a String. To get more information about the 516*0e209d39SAndroid Build Coastguard Worker * formatting result, use formatToValue(). 517*0e209d39SAndroid Build Coastguard Worker * 518*0e209d39SAndroid Build Coastguard Worker * @param direction NEXT, LAST, THIS, etc. 519*0e209d39SAndroid Build Coastguard Worker * @param unit e.g SATURDAY, DAY, MONTH 520*0e209d39SAndroid Build Coastguard Worker * @param appendTo The string to which the formatted result will be 521*0e209d39SAndroid Build Coastguard Worker * appended. If the value of direction is documented as not being fully 522*0e209d39SAndroid Build Coastguard Worker * supported in all locales then this method leaves appendTo unchanged if 523*0e209d39SAndroid Build Coastguard Worker * no format string is available. 524*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 525*0e209d39SAndroid Build Coastguard Worker * @return appendTo 526*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 527*0e209d39SAndroid Build Coastguard Worker */ 528*0e209d39SAndroid Build Coastguard Worker UnicodeString& format( 529*0e209d39SAndroid Build Coastguard Worker UDateDirection direction, 530*0e209d39SAndroid Build Coastguard Worker UDateAbsoluteUnit unit, 531*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 532*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 533*0e209d39SAndroid Build Coastguard Worker 534*0e209d39SAndroid Build Coastguard Worker /** 535*0e209d39SAndroid Build Coastguard Worker * Formats a relative date without a quantity. 536*0e209d39SAndroid Build Coastguard Worker * 537*0e209d39SAndroid Build Coastguard Worker * This method returns a FormattedRelativeDateTime, which exposes more 538*0e209d39SAndroid Build Coastguard Worker * information than the String returned by format(). 539*0e209d39SAndroid Build Coastguard Worker * 540*0e209d39SAndroid Build Coastguard Worker * If the string is not available in the requested locale, the return 541*0e209d39SAndroid Build Coastguard Worker * value will be empty (calling toString will give an empty string). 542*0e209d39SAndroid Build Coastguard Worker * 543*0e209d39SAndroid Build Coastguard Worker * @param direction NEXT, LAST, THIS, etc. 544*0e209d39SAndroid Build Coastguard Worker * @param unit e.g SATURDAY, DAY, MONTH 545*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 546*0e209d39SAndroid Build Coastguard Worker * @return The formatted relative datetime 547*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 548*0e209d39SAndroid Build Coastguard Worker */ 549*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime formatToValue( 550*0e209d39SAndroid Build Coastguard Worker UDateDirection direction, 551*0e209d39SAndroid Build Coastguard Worker UDateAbsoluteUnit unit, 552*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 553*0e209d39SAndroid Build Coastguard Worker 554*0e209d39SAndroid Build Coastguard Worker /** 555*0e209d39SAndroid Build Coastguard Worker * Format a combination of URelativeDateTimeUnit and numeric offset 556*0e209d39SAndroid Build Coastguard Worker * using a numeric style, e.g. "1 week ago", "in 1 week", 557*0e209d39SAndroid Build Coastguard Worker * "5 weeks ago", "in 5 weeks". 558*0e209d39SAndroid Build Coastguard Worker * 559*0e209d39SAndroid Build Coastguard Worker * This method returns a String. To get more information about the 560*0e209d39SAndroid Build Coastguard Worker * formatting result, use formatNumericToValue(). 561*0e209d39SAndroid Build Coastguard Worker * 562*0e209d39SAndroid Build Coastguard Worker * @param offset The signed offset for the specified unit. This 563*0e209d39SAndroid Build Coastguard Worker * will be formatted according to this object's 564*0e209d39SAndroid Build Coastguard Worker * NumberFormat object. 565*0e209d39SAndroid Build Coastguard Worker * @param unit The unit to use when formatting the relative 566*0e209d39SAndroid Build Coastguard Worker * date, e.g. UDAT_REL_UNIT_WEEK, 567*0e209d39SAndroid Build Coastguard Worker * UDAT_REL_UNIT_FRIDAY. 568*0e209d39SAndroid Build Coastguard Worker * @param appendTo The string to which the formatted result will be 569*0e209d39SAndroid Build Coastguard Worker * appended. 570*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 571*0e209d39SAndroid Build Coastguard Worker * @return appendTo 572*0e209d39SAndroid Build Coastguard Worker * @stable ICU 57 573*0e209d39SAndroid Build Coastguard Worker */ 574*0e209d39SAndroid Build Coastguard Worker UnicodeString& formatNumeric( 575*0e209d39SAndroid Build Coastguard Worker double offset, 576*0e209d39SAndroid Build Coastguard Worker URelativeDateTimeUnit unit, 577*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 578*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 579*0e209d39SAndroid Build Coastguard Worker 580*0e209d39SAndroid Build Coastguard Worker /** 581*0e209d39SAndroid Build Coastguard Worker * Format a combination of URelativeDateTimeUnit and numeric offset 582*0e209d39SAndroid Build Coastguard Worker * using a numeric style, e.g. "1 week ago", "in 1 week", 583*0e209d39SAndroid Build Coastguard Worker * "5 weeks ago", "in 5 weeks". 584*0e209d39SAndroid Build Coastguard Worker * 585*0e209d39SAndroid Build Coastguard Worker * This method returns a FormattedRelativeDateTime, which exposes more 586*0e209d39SAndroid Build Coastguard Worker * information than the String returned by formatNumeric(). 587*0e209d39SAndroid Build Coastguard Worker * 588*0e209d39SAndroid Build Coastguard Worker * @param offset The signed offset for the specified unit. This 589*0e209d39SAndroid Build Coastguard Worker * will be formatted according to this object's 590*0e209d39SAndroid Build Coastguard Worker * NumberFormat object. 591*0e209d39SAndroid Build Coastguard Worker * @param unit The unit to use when formatting the relative 592*0e209d39SAndroid Build Coastguard Worker * date, e.g. UDAT_REL_UNIT_WEEK, 593*0e209d39SAndroid Build Coastguard Worker * UDAT_REL_UNIT_FRIDAY. 594*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 595*0e209d39SAndroid Build Coastguard Worker * @return The formatted relative datetime 596*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 597*0e209d39SAndroid Build Coastguard Worker */ 598*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime formatNumericToValue( 599*0e209d39SAndroid Build Coastguard Worker double offset, 600*0e209d39SAndroid Build Coastguard Worker URelativeDateTimeUnit unit, 601*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 602*0e209d39SAndroid Build Coastguard Worker 603*0e209d39SAndroid Build Coastguard Worker /** 604*0e209d39SAndroid Build Coastguard Worker * Format a combination of URelativeDateTimeUnit and numeric offset 605*0e209d39SAndroid Build Coastguard Worker * using a text style if possible, e.g. "last week", "this week", 606*0e209d39SAndroid Build Coastguard Worker * "next week", "yesterday", "tomorrow". Falls back to numeric 607*0e209d39SAndroid Build Coastguard Worker * style if no appropriate text term is available for the specified 608*0e209d39SAndroid Build Coastguard Worker * offset in the object's locale. 609*0e209d39SAndroid Build Coastguard Worker * 610*0e209d39SAndroid Build Coastguard Worker * This method returns a String. To get more information about the 611*0e209d39SAndroid Build Coastguard Worker * formatting result, use formatToValue(). 612*0e209d39SAndroid Build Coastguard Worker * 613*0e209d39SAndroid Build Coastguard Worker * @param offset The signed offset for the specified unit. 614*0e209d39SAndroid Build Coastguard Worker * @param unit The unit to use when formatting the relative 615*0e209d39SAndroid Build Coastguard Worker * date, e.g. UDAT_REL_UNIT_WEEK, 616*0e209d39SAndroid Build Coastguard Worker * UDAT_REL_UNIT_FRIDAY. 617*0e209d39SAndroid Build Coastguard Worker * @param appendTo The string to which the formatted result will be 618*0e209d39SAndroid Build Coastguard Worker * appended. 619*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 620*0e209d39SAndroid Build Coastguard Worker * @return appendTo 621*0e209d39SAndroid Build Coastguard Worker * @stable ICU 57 622*0e209d39SAndroid Build Coastguard Worker */ 623*0e209d39SAndroid Build Coastguard Worker UnicodeString& format( 624*0e209d39SAndroid Build Coastguard Worker double offset, 625*0e209d39SAndroid Build Coastguard Worker URelativeDateTimeUnit unit, 626*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 627*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 628*0e209d39SAndroid Build Coastguard Worker 629*0e209d39SAndroid Build Coastguard Worker /** 630*0e209d39SAndroid Build Coastguard Worker * Format a combination of URelativeDateTimeUnit and numeric offset 631*0e209d39SAndroid Build Coastguard Worker * using a text style if possible, e.g. "last week", "this week", 632*0e209d39SAndroid Build Coastguard Worker * "next week", "yesterday", "tomorrow". Falls back to numeric 633*0e209d39SAndroid Build Coastguard Worker * style if no appropriate text term is available for the specified 634*0e209d39SAndroid Build Coastguard Worker * offset in the object's locale. 635*0e209d39SAndroid Build Coastguard Worker * 636*0e209d39SAndroid Build Coastguard Worker * This method returns a FormattedRelativeDateTime, which exposes more 637*0e209d39SAndroid Build Coastguard Worker * information than the String returned by format(). 638*0e209d39SAndroid Build Coastguard Worker * 639*0e209d39SAndroid Build Coastguard Worker * @param offset The signed offset for the specified unit. 640*0e209d39SAndroid Build Coastguard Worker * @param unit The unit to use when formatting the relative 641*0e209d39SAndroid Build Coastguard Worker * date, e.g. UDAT_REL_UNIT_WEEK, 642*0e209d39SAndroid Build Coastguard Worker * UDAT_REL_UNIT_FRIDAY. 643*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 644*0e209d39SAndroid Build Coastguard Worker * @return The formatted relative datetime 645*0e209d39SAndroid Build Coastguard Worker * @stable ICU 64 646*0e209d39SAndroid Build Coastguard Worker */ 647*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime formatToValue( 648*0e209d39SAndroid Build Coastguard Worker double offset, 649*0e209d39SAndroid Build Coastguard Worker URelativeDateTimeUnit unit, 650*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 651*0e209d39SAndroid Build Coastguard Worker 652*0e209d39SAndroid Build Coastguard Worker /** 653*0e209d39SAndroid Build Coastguard Worker * Combines a relative date string and a time string in this object's 654*0e209d39SAndroid Build Coastguard Worker * locale. This is done with the same date-time separator used for the 655*0e209d39SAndroid Build Coastguard Worker * default calendar in this locale. 656*0e209d39SAndroid Build Coastguard Worker * 657*0e209d39SAndroid Build Coastguard Worker * @param relativeDateString the relative date, e.g 'yesterday' 658*0e209d39SAndroid Build Coastguard Worker * @param timeString the time e.g '3:45' 659*0e209d39SAndroid Build Coastguard Worker * @param appendTo concatenated date and time appended here 660*0e209d39SAndroid Build Coastguard Worker * @param status ICU error code returned here. 661*0e209d39SAndroid Build Coastguard Worker * @return appendTo 662*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 663*0e209d39SAndroid Build Coastguard Worker */ 664*0e209d39SAndroid Build Coastguard Worker UnicodeString& combineDateAndTime( 665*0e209d39SAndroid Build Coastguard Worker const UnicodeString& relativeDateString, 666*0e209d39SAndroid Build Coastguard Worker const UnicodeString& timeString, 667*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 668*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 669*0e209d39SAndroid Build Coastguard Worker 670*0e209d39SAndroid Build Coastguard Worker /** 671*0e209d39SAndroid Build Coastguard Worker * Returns the NumberFormat this object is using. 672*0e209d39SAndroid Build Coastguard Worker * 673*0e209d39SAndroid Build Coastguard Worker * @stable ICU 53 674*0e209d39SAndroid Build Coastguard Worker */ 675*0e209d39SAndroid Build Coastguard Worker const NumberFormat& getNumberFormat() const; 676*0e209d39SAndroid Build Coastguard Worker 677*0e209d39SAndroid Build Coastguard Worker /** 678*0e209d39SAndroid Build Coastguard Worker * Returns the capitalization context. 679*0e209d39SAndroid Build Coastguard Worker * 680*0e209d39SAndroid Build Coastguard Worker * @stable ICU 54 681*0e209d39SAndroid Build Coastguard Worker */ 682*0e209d39SAndroid Build Coastguard Worker UDisplayContext getCapitalizationContext() const; 683*0e209d39SAndroid Build Coastguard Worker 684*0e209d39SAndroid Build Coastguard Worker /** 685*0e209d39SAndroid Build Coastguard Worker * Returns the format style. 686*0e209d39SAndroid Build Coastguard Worker * 687*0e209d39SAndroid Build Coastguard Worker * @stable ICU 54 688*0e209d39SAndroid Build Coastguard Worker */ 689*0e209d39SAndroid Build Coastguard Worker UDateRelativeDateTimeFormatterStyle getFormatStyle() const; 690*0e209d39SAndroid Build Coastguard Worker 691*0e209d39SAndroid Build Coastguard Worker private: 692*0e209d39SAndroid Build Coastguard Worker const RelativeDateTimeCacheData* fCache; 693*0e209d39SAndroid Build Coastguard Worker const SharedNumberFormat *fNumberFormat; 694*0e209d39SAndroid Build Coastguard Worker const SharedPluralRules *fPluralRules; 695*0e209d39SAndroid Build Coastguard Worker UDateRelativeDateTimeFormatterStyle fStyle; 696*0e209d39SAndroid Build Coastguard Worker UDisplayContext fContext; 697*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_BREAK_ITERATION 698*0e209d39SAndroid Build Coastguard Worker const SharedBreakIterator *fOptBreakIterator; 699*0e209d39SAndroid Build Coastguard Worker #else 700*0e209d39SAndroid Build Coastguard Worker std::nullptr_t fOptBreakIterator = nullptr; 701*0e209d39SAndroid Build Coastguard Worker #endif // !UCONFIG_NO_BREAK_ITERATION 702*0e209d39SAndroid Build Coastguard Worker Locale fLocale; 703*0e209d39SAndroid Build Coastguard Worker void init( 704*0e209d39SAndroid Build Coastguard Worker NumberFormat *nfToAdopt, 705*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_BREAK_ITERATION 706*0e209d39SAndroid Build Coastguard Worker BreakIterator *brkIter, 707*0e209d39SAndroid Build Coastguard Worker #else 708*0e209d39SAndroid Build Coastguard Worker std::nullptr_t, 709*0e209d39SAndroid Build Coastguard Worker #endif // !UCONFIG_NO_BREAK_ITERATION 710*0e209d39SAndroid Build Coastguard Worker UErrorCode &status); 711*0e209d39SAndroid Build Coastguard Worker UnicodeString& adjustForContext(UnicodeString &) const; 712*0e209d39SAndroid Build Coastguard Worker UBool checkNoAdjustForContext(UErrorCode& status) const; 713*0e209d39SAndroid Build Coastguard Worker 714*0e209d39SAndroid Build Coastguard Worker template<typename F, typename... Args> 715*0e209d39SAndroid Build Coastguard Worker UnicodeString& doFormat( 716*0e209d39SAndroid Build Coastguard Worker F callback, 717*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 718*0e209d39SAndroid Build Coastguard Worker UErrorCode& status, 719*0e209d39SAndroid Build Coastguard Worker Args... args) const; 720*0e209d39SAndroid Build Coastguard Worker 721*0e209d39SAndroid Build Coastguard Worker template<typename F, typename... Args> 722*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTime doFormatToValue( 723*0e209d39SAndroid Build Coastguard Worker F callback, 724*0e209d39SAndroid Build Coastguard Worker UErrorCode& status, 725*0e209d39SAndroid Build Coastguard Worker Args... args) const; 726*0e209d39SAndroid Build Coastguard Worker 727*0e209d39SAndroid Build Coastguard Worker void formatImpl( 728*0e209d39SAndroid Build Coastguard Worker double quantity, 729*0e209d39SAndroid Build Coastguard Worker UDateDirection direction, 730*0e209d39SAndroid Build Coastguard Worker UDateRelativeUnit unit, 731*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTimeData& output, 732*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 733*0e209d39SAndroid Build Coastguard Worker void formatAbsoluteImpl( 734*0e209d39SAndroid Build Coastguard Worker UDateDirection direction, 735*0e209d39SAndroid Build Coastguard Worker UDateAbsoluteUnit unit, 736*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTimeData& output, 737*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 738*0e209d39SAndroid Build Coastguard Worker void formatNumericImpl( 739*0e209d39SAndroid Build Coastguard Worker double offset, 740*0e209d39SAndroid Build Coastguard Worker URelativeDateTimeUnit unit, 741*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTimeData& output, 742*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 743*0e209d39SAndroid Build Coastguard Worker void formatRelativeImpl( 744*0e209d39SAndroid Build Coastguard Worker double offset, 745*0e209d39SAndroid Build Coastguard Worker URelativeDateTimeUnit unit, 746*0e209d39SAndroid Build Coastguard Worker FormattedRelativeDateTimeData& output, 747*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 748*0e209d39SAndroid Build Coastguard Worker }; 749*0e209d39SAndroid Build Coastguard Worker 750*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 751*0e209d39SAndroid Build Coastguard Worker 752*0e209d39SAndroid Build Coastguard Worker #endif /* !UCONFIG_NO_FORMATTING */ 753*0e209d39SAndroid Build Coastguard Worker 754*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */ 755*0e209d39SAndroid Build Coastguard Worker 756*0e209d39SAndroid Build Coastguard Worker #endif /* __RELDATEFMT_H */ 757