1999-08-16 21:50:52 +00:00
|
|
|
/*
|
2007-07-27 03:12:12 +00:00
|
|
|
*******************************************************************************
|
2013-09-16 12:45:41 +00:00
|
|
|
* Copyright (C) 1997-2013, International Business Machines Corporation and *
|
2007-07-27 03:12:12 +00:00
|
|
|
* others. All Rights Reserved. *
|
|
|
|
*******************************************************************************
|
|
|
|
*
|
|
|
|
* File DATEFMT.CPP
|
|
|
|
*
|
|
|
|
* Modification History:
|
|
|
|
*
|
|
|
|
* Date Name Description
|
|
|
|
* 02/19/97 aliu Converted from java.
|
|
|
|
* 03/31/97 aliu Modified extensively to work with 50 locales.
|
|
|
|
* 04/01/97 aliu Added support for centuries.
|
|
|
|
* 08/12/97 aliu Fixed operator== to use Calendar::equivalentTo.
|
|
|
|
* 07/20/98 stephen Changed ParsePosition initialization
|
|
|
|
********************************************************************************
|
|
|
|
*/
|
1999-08-16 21:50:52 +00:00
|
|
|
|
2002-09-20 01:54:48 +00:00
|
|
|
#include "unicode/utypes.h"
|
|
|
|
|
|
|
|
#if !UCONFIG_NO_FORMATTING
|
|
|
|
|
2004-09-03 15:24:16 +00:00
|
|
|
#include "unicode/ures.h"
|
1999-12-28 23:57:50 +00:00
|
|
|
#include "unicode/datefmt.h"
|
|
|
|
#include "unicode/smpdtfmt.h"
|
2008-05-28 00:33:44 +00:00
|
|
|
#include "unicode/dtptngen.h"
|
2007-04-09 22:29:57 +00:00
|
|
|
#include "reldtfmt.h"
|
1999-08-16 21:50:52 +00:00
|
|
|
|
2006-01-12 19:53:58 +00:00
|
|
|
#include "cstring.h"
|
|
|
|
#include "windtfmt.h"
|
|
|
|
|
2003-10-26 10:24:58 +00:00
|
|
|
#if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL)
|
|
|
|
#include <stdio.h>
|
|
|
|
#endif
|
|
|
|
|
1999-08-16 21:50:52 +00:00
|
|
|
// *****************************************************************************
|
|
|
|
// class DateFormat
|
|
|
|
// *****************************************************************************
|
|
|
|
|
2001-10-08 23:26:58 +00:00
|
|
|
U_NAMESPACE_BEGIN
|
|
|
|
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::DateFormat()
|
|
|
|
: fCalendar(0),
|
|
|
|
fNumberFormat(0)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
DateFormat::DateFormat(const DateFormat& other)
|
2001-05-24 21:11:44 +00:00
|
|
|
: Format(other),
|
|
|
|
fCalendar(0),
|
1999-08-16 21:50:52 +00:00
|
|
|
fNumberFormat(0)
|
|
|
|
{
|
|
|
|
*this = other;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
DateFormat& DateFormat::operator=(const DateFormat& other)
|
|
|
|
{
|
|
|
|
if (this != &other)
|
|
|
|
{
|
|
|
|
delete fCalendar;
|
|
|
|
delete fNumberFormat;
|
2003-06-04 22:02:07 +00:00
|
|
|
if(other.fCalendar) {
|
|
|
|
fCalendar = other.fCalendar->clone();
|
|
|
|
} else {
|
|
|
|
fCalendar = NULL;
|
|
|
|
}
|
2003-06-05 00:00:07 +00:00
|
|
|
if(other.fNumberFormat) {
|
|
|
|
fNumberFormat = (NumberFormat*)other.fNumberFormat->clone();
|
|
|
|
} else {
|
|
|
|
fNumberFormat = NULL;
|
|
|
|
}
|
2013-09-16 12:45:41 +00:00
|
|
|
fBoolFlags = other.fBoolFlags;
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
DateFormat::~DateFormat()
|
|
|
|
{
|
|
|
|
delete fCalendar;
|
|
|
|
delete fNumberFormat;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2000-05-18 22:08:39 +00:00
|
|
|
UBool
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::operator==(const Format& other) const
|
|
|
|
{
|
|
|
|
// This protected comparison operator should only be called by subclasses
|
|
|
|
// which have confirmed that the other object being compared against is
|
|
|
|
// an instance of a sublcass of DateFormat. THIS IS IMPORTANT.
|
|
|
|
|
2004-02-13 01:50:59 +00:00
|
|
|
// Format::operator== guarantees that this cast is safe
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat* fmt = (DateFormat*)&other;
|
|
|
|
|
|
|
|
return (this == fmt) ||
|
2004-02-13 01:50:59 +00:00
|
|
|
(Format::operator==(other) &&
|
2003-06-05 00:00:07 +00:00
|
|
|
fCalendar&&(fCalendar->isEquivalentTo(*fmt->fCalendar)) &&
|
2004-02-13 01:50:59 +00:00
|
|
|
(fNumberFormat && *fNumberFormat == *fmt->fNumberFormat));
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UnicodeString&
|
|
|
|
DateFormat::format(const Formattable& obj,
|
2002-11-25 18:31:23 +00:00
|
|
|
UnicodeString& appendTo,
|
1999-08-16 21:50:52 +00:00
|
|
|
FieldPosition& fieldPosition,
|
|
|
|
UErrorCode& status) const
|
|
|
|
{
|
2002-11-25 18:31:23 +00:00
|
|
|
if (U_FAILURE(status)) return appendTo;
|
1999-08-16 21:50:52 +00:00
|
|
|
|
|
|
|
// if the type of the Formattable is double or long, treat it as if it were a Date
|
2002-11-25 18:31:23 +00:00
|
|
|
UDate date = 0;
|
1999-08-16 21:50:52 +00:00
|
|
|
switch (obj.getType())
|
|
|
|
{
|
|
|
|
case Formattable::kDate:
|
2002-11-25 18:31:23 +00:00
|
|
|
date = obj.getDate();
|
1999-08-16 21:50:52 +00:00
|
|
|
break;
|
|
|
|
case Formattable::kDouble:
|
2002-11-25 18:31:23 +00:00
|
|
|
date = (UDate)obj.getDouble();
|
1999-08-16 21:50:52 +00:00
|
|
|
break;
|
|
|
|
case Formattable::kLong:
|
2002-11-25 18:31:23 +00:00
|
|
|
date = (UDate)obj.getLong();
|
1999-08-16 21:50:52 +00:00
|
|
|
break;
|
|
|
|
default:
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ILLEGAL_ARGUMENT_ERROR;
|
2002-11-25 18:31:23 +00:00
|
|
|
return appendTo;
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Is this right?
|
|
|
|
//if (fieldPosition.getBeginIndex() == fieldPosition.getEndIndex())
|
1999-10-07 00:07:53 +00:00
|
|
|
// status = U_ILLEGAL_ARGUMENT_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
|
2002-11-25 18:31:23 +00:00
|
|
|
return format(date, appendTo, fieldPosition);
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2009-12-17 22:15:20 +00:00
|
|
|
UnicodeString&
|
|
|
|
DateFormat::format(const Formattable& obj,
|
|
|
|
UnicodeString& appendTo,
|
2010-01-28 19:39:24 +00:00
|
|
|
FieldPositionIterator* posIter,
|
2009-12-17 22:15:20 +00:00
|
|
|
UErrorCode& status) const
|
|
|
|
{
|
|
|
|
if (U_FAILURE(status)) return appendTo;
|
|
|
|
|
|
|
|
// if the type of the Formattable is double or long, treat it as if it were a Date
|
|
|
|
UDate date = 0;
|
|
|
|
switch (obj.getType())
|
|
|
|
{
|
|
|
|
case Formattable::kDate:
|
|
|
|
date = obj.getDate();
|
|
|
|
break;
|
|
|
|
case Formattable::kDouble:
|
|
|
|
date = (UDate)obj.getDouble();
|
|
|
|
break;
|
|
|
|
case Formattable::kLong:
|
|
|
|
date = (UDate)obj.getLong();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
status = U_ILLEGAL_ARGUMENT_ERROR;
|
|
|
|
return appendTo;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Is this right?
|
|
|
|
//if (fieldPosition.getBeginIndex() == fieldPosition.getEndIndex())
|
|
|
|
// status = U_ILLEGAL_ARGUMENT_ERROR;
|
|
|
|
|
|
|
|
return format(date, appendTo, posIter, status);
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
// Default implementation for backwards compatibility, subclasses should implement.
|
|
|
|
UnicodeString&
|
|
|
|
DateFormat::format(Calendar& /* unused cal */,
|
|
|
|
UnicodeString& appendTo,
|
2010-01-28 19:39:24 +00:00
|
|
|
FieldPositionIterator* /* unused posIter */,
|
2009-12-17 22:15:20 +00:00
|
|
|
UErrorCode& status) const {
|
|
|
|
if (U_SUCCESS(status)) {
|
|
|
|
status = U_UNSUPPORTED_ERROR;
|
|
|
|
}
|
|
|
|
return appendTo;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2002-03-02 00:29:54 +00:00
|
|
|
UnicodeString&
|
2002-11-25 18:31:23 +00:00
|
|
|
DateFormat::format(UDate date, UnicodeString& appendTo, FieldPosition& fieldPosition) const {
|
2002-03-02 00:29:54 +00:00
|
|
|
if (fCalendar != NULL) {
|
2011-12-04 00:33:15 +00:00
|
|
|
// Use a clone of our calendar instance
|
|
|
|
Calendar* calClone = fCalendar->clone();
|
|
|
|
if (calClone != NULL) {
|
|
|
|
UErrorCode ec = U_ZERO_ERROR;
|
|
|
|
calClone->setTime(date, ec);
|
|
|
|
if (U_SUCCESS(ec)) {
|
|
|
|
format(*calClone, appendTo, fieldPosition);
|
|
|
|
}
|
|
|
|
delete calClone;
|
2002-03-02 00:29:54 +00:00
|
|
|
}
|
2009-12-17 22:15:20 +00:00
|
|
|
}
|
|
|
|
return appendTo;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UnicodeString&
|
2010-01-28 19:39:24 +00:00
|
|
|
DateFormat::format(UDate date, UnicodeString& appendTo, FieldPositionIterator* posIter,
|
2009-12-17 22:15:20 +00:00
|
|
|
UErrorCode& status) const {
|
|
|
|
if (fCalendar != NULL) {
|
2011-12-04 00:33:15 +00:00
|
|
|
Calendar* calClone = fCalendar->clone();
|
|
|
|
if (calClone != NULL) {
|
|
|
|
calClone->setTime(date, status);
|
|
|
|
if (U_SUCCESS(status)) {
|
|
|
|
format(*calClone, appendTo, posIter, status);
|
|
|
|
}
|
|
|
|
delete calClone;
|
2009-12-17 22:15:20 +00:00
|
|
|
}
|
2002-03-02 00:29:54 +00:00
|
|
|
}
|
2002-11-25 18:31:23 +00:00
|
|
|
return appendTo;
|
2002-03-02 00:29:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
1999-08-16 21:50:52 +00:00
|
|
|
UnicodeString&
|
2002-11-25 18:31:23 +00:00
|
|
|
DateFormat::format(UDate date, UnicodeString& appendTo) const
|
1999-08-16 21:50:52 +00:00
|
|
|
{
|
|
|
|
// Note that any error information is just lost. That's okay
|
|
|
|
// for this convenience method.
|
|
|
|
FieldPosition fpos(0);
|
2002-11-25 18:31:23 +00:00
|
|
|
return format(date, appendTo, fpos);
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2002-03-02 00:29:54 +00:00
|
|
|
UDate
|
|
|
|
DateFormat::parse(const UnicodeString& text,
|
|
|
|
ParsePosition& pos) const
|
|
|
|
{
|
2007-11-28 20:49:58 +00:00
|
|
|
UDate d = 0; // Error return UDate is 0 (the epoch)
|
2002-03-02 00:29:54 +00:00
|
|
|
if (fCalendar != NULL) {
|
2011-12-04 00:33:15 +00:00
|
|
|
Calendar* calClone = fCalendar->clone();
|
|
|
|
if (calClone != NULL) {
|
|
|
|
int32_t start = pos.getIndex();
|
|
|
|
calClone->clear();
|
|
|
|
parse(text, *calClone, pos);
|
|
|
|
if (pos.getIndex() != start) {
|
|
|
|
UErrorCode ec = U_ZERO_ERROR;
|
|
|
|
d = calClone->getTime(ec);
|
|
|
|
if (U_FAILURE(ec)) {
|
|
|
|
// We arrive here if fCalendar => calClone is non-lenient and
|
|
|
|
// there is an out-of-range field. We don't know which field
|
|
|
|
// was illegal so we set the error index to the start.
|
|
|
|
pos.setIndex(start);
|
|
|
|
pos.setErrorIndex(start);
|
|
|
|
d = 0;
|
|
|
|
}
|
2002-03-02 00:29:54 +00:00
|
|
|
}
|
2011-12-04 00:33:15 +00:00
|
|
|
delete calClone;
|
2002-04-02 02:55:31 +00:00
|
|
|
}
|
2002-03-02 00:29:54 +00:00
|
|
|
}
|
2007-11-28 20:49:58 +00:00
|
|
|
return d;
|
2002-03-02 00:29:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
1999-08-16 21:50:52 +00:00
|
|
|
UDate
|
|
|
|
DateFormat::parse(const UnicodeString& text,
|
|
|
|
UErrorCode& status) const
|
|
|
|
{
|
1999-10-18 22:48:32 +00:00
|
|
|
if (U_FAILURE(status)) return 0;
|
1999-08-16 21:50:52 +00:00
|
|
|
|
|
|
|
ParsePosition pos(0);
|
|
|
|
UDate result = parse(text, pos);
|
2003-10-26 10:24:58 +00:00
|
|
|
if (pos.getIndex() == 0) {
|
|
|
|
#if defined (U_DEBUG_CAL)
|
|
|
|
fprintf(stderr, "%s:%d - - failed to parse - err index %d\n"
|
|
|
|
, __FILE__, __LINE__, pos.getErrorIndex() );
|
|
|
|
#endif
|
|
|
|
status = U_ILLEGAL_ARGUMENT_ERROR;
|
|
|
|
}
|
1999-08-16 21:50:52 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void
|
|
|
|
DateFormat::parseObject(const UnicodeString& source,
|
|
|
|
Formattable& result,
|
|
|
|
ParsePosition& pos) const
|
|
|
|
{
|
|
|
|
result.setDate(parse(source, pos));
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2004-08-24 17:38:33 +00:00
|
|
|
DateFormat* U_EXPORT2
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::createTimeInstance(DateFormat::EStyle style,
|
|
|
|
const Locale& aLocale)
|
|
|
|
{
|
|
|
|
return create(style, kNone, aLocale);
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2004-08-24 17:38:33 +00:00
|
|
|
DateFormat* U_EXPORT2
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::createDateInstance(DateFormat::EStyle style,
|
|
|
|
const Locale& aLocale)
|
|
|
|
{
|
2004-08-24 17:38:33 +00:00
|
|
|
// +4 to set the correct index for getting data out of
|
|
|
|
// LocaleElements.
|
|
|
|
if(style != kNone)
|
|
|
|
{
|
|
|
|
style = (EStyle) (style + kDateOffset);
|
|
|
|
}
|
|
|
|
return create(kNone, (EStyle) (style), aLocale);
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2004-08-24 17:38:33 +00:00
|
|
|
DateFormat* U_EXPORT2
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::createDateTimeInstance(EStyle dateStyle,
|
|
|
|
EStyle timeStyle,
|
|
|
|
const Locale& aLocale)
|
|
|
|
{
|
2004-08-24 17:38:33 +00:00
|
|
|
if(dateStyle != kNone)
|
|
|
|
{
|
|
|
|
dateStyle = (EStyle) (dateStyle + kDateOffset);
|
|
|
|
}
|
|
|
|
return create(timeStyle, dateStyle, aLocale);
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2004-08-24 17:38:33 +00:00
|
|
|
DateFormat* U_EXPORT2
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::createInstance()
|
|
|
|
{
|
|
|
|
return create(kShort, (EStyle) (kShort + kDateOffset), Locale::getDefault());
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2004-08-24 17:38:33 +00:00
|
|
|
DateFormat* U_EXPORT2
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale)
|
|
|
|
{
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
2011-07-23 00:10:30 +00:00
|
|
|
#if U_PLATFORM_HAS_WIN32_API
|
2006-01-12 19:53:58 +00:00
|
|
|
char buffer[8];
|
|
|
|
int32_t count = locale.getKeywordValue("compat", buffer, sizeof(buffer), status);
|
|
|
|
|
|
|
|
// if the locale has "@compat=host", create a host-specific DateFormat...
|
|
|
|
if (count > 0 && uprv_strcmp(buffer, "host") == 0) {
|
2006-01-23 23:25:00 +00:00
|
|
|
Win32DateFormat *f = new Win32DateFormat(timeStyle, dateStyle, locale, status);
|
2006-01-12 19:53:58 +00:00
|
|
|
|
|
|
|
if (U_SUCCESS(status)) {
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
delete f;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2007-04-09 22:29:57 +00:00
|
|
|
// is it relative?
|
2007-04-10 22:57:25 +00:00
|
|
|
if(/*((timeStyle!=UDAT_NONE)&&(timeStyle & UDAT_RELATIVE)) || */((dateStyle!=kNone)&&((dateStyle-kDateOffset) & UDAT_RELATIVE))) {
|
2007-04-09 22:29:57 +00:00
|
|
|
RelativeDateFormat *r = new RelativeDateFormat((UDateFormatStyle)timeStyle, (UDateFormatStyle)(dateStyle-kDateOffset), locale, status);
|
|
|
|
if(U_SUCCESS(status)) return r;
|
|
|
|
delete r;
|
|
|
|
status = U_ZERO_ERROR;
|
|
|
|
}
|
2006-01-12 19:53:58 +00:00
|
|
|
|
|
|
|
// Try to create a SimpleDateFormat of the desired style.
|
1999-08-16 21:50:52 +00:00
|
|
|
SimpleDateFormat *f = new SimpleDateFormat(timeStyle, dateStyle, locale, status);
|
1999-10-18 22:48:32 +00:00
|
|
|
if (U_SUCCESS(status)) return f;
|
1999-08-16 21:50:52 +00:00
|
|
|
delete f;
|
|
|
|
|
|
|
|
// If that fails, try to create a format using the default pattern and
|
|
|
|
// the DateFormatSymbols for this locale.
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
f = new SimpleDateFormat(locale, status);
|
1999-10-18 22:48:32 +00:00
|
|
|
if (U_SUCCESS(status)) return f;
|
1999-08-16 21:50:52 +00:00
|
|
|
delete f;
|
|
|
|
|
|
|
|
// This should never really happen, because the preceding constructor
|
|
|
|
// should always succeed. If the resource data is unavailable, a last
|
|
|
|
// resort object should be returned.
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2004-08-24 17:38:33 +00:00
|
|
|
const Locale* U_EXPORT2
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::getAvailableLocales(int32_t& count)
|
|
|
|
{
|
2001-09-01 01:09:38 +00:00
|
|
|
// Get the list of installed locales.
|
|
|
|
// Even if root has the correct date format for this locale,
|
|
|
|
// it's still a valid locale (we don't worry about data fallbacks).
|
|
|
|
return Locale::getAvailableLocales(count);
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void
|
|
|
|
DateFormat::adoptCalendar(Calendar* newCalendar)
|
|
|
|
{
|
|
|
|
delete fCalendar;
|
|
|
|
fCalendar = newCalendar;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void
|
|
|
|
DateFormat::setCalendar(const Calendar& newCalendar)
|
|
|
|
{
|
2008-02-23 19:15:18 +00:00
|
|
|
Calendar* newCalClone = newCalendar.clone();
|
|
|
|
if (newCalClone != NULL) {
|
|
|
|
adoptCalendar(newCalClone);
|
|
|
|
}
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const Calendar*
|
|
|
|
DateFormat::getCalendar() const
|
|
|
|
{
|
|
|
|
return fCalendar;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void
|
|
|
|
DateFormat::adoptNumberFormat(NumberFormat* newNumberFormat)
|
|
|
|
{
|
|
|
|
delete fNumberFormat;
|
|
|
|
fNumberFormat = newNumberFormat;
|
2001-03-07 22:01:48 +00:00
|
|
|
newNumberFormat->setParseIntegerOnly(TRUE);
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void
|
|
|
|
DateFormat::setNumberFormat(const NumberFormat& newNumberFormat)
|
|
|
|
{
|
2008-02-23 19:15:18 +00:00
|
|
|
NumberFormat* newNumFmtClone = (NumberFormat*)newNumberFormat.clone();
|
|
|
|
if (newNumFmtClone != NULL) {
|
|
|
|
adoptNumberFormat(newNumFmtClone);
|
|
|
|
}
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const NumberFormat*
|
|
|
|
DateFormat::getNumberFormat() const
|
|
|
|
{
|
|
|
|
return fNumberFormat;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void
|
|
|
|
DateFormat::adoptTimeZone(TimeZone* zone)
|
|
|
|
{
|
2008-02-23 19:15:18 +00:00
|
|
|
if (fCalendar != NULL) {
|
|
|
|
fCalendar->adoptTimeZone(zone);
|
|
|
|
}
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void
|
|
|
|
DateFormat::setTimeZone(const TimeZone& zone)
|
|
|
|
{
|
2008-02-23 19:15:18 +00:00
|
|
|
if (fCalendar != NULL) {
|
|
|
|
fCalendar->setTimeZone(zone);
|
|
|
|
}
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const TimeZone&
|
|
|
|
DateFormat::getTimeZone() const
|
|
|
|
{
|
2008-02-23 19:15:18 +00:00
|
|
|
if (fCalendar != NULL) {
|
|
|
|
return fCalendar->getTimeZone();
|
|
|
|
}
|
|
|
|
// If calendar doesn't exists, create default timezone.
|
|
|
|
// fCalendar is rarely null
|
|
|
|
return *(TimeZone::createDefault());
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void
|
2000-05-18 22:08:39 +00:00
|
|
|
DateFormat::setLenient(UBool lenient)
|
1999-08-16 21:50:52 +00:00
|
|
|
{
|
2008-02-23 19:15:18 +00:00
|
|
|
if (fCalendar != NULL) {
|
|
|
|
fCalendar->setLenient(lenient);
|
|
|
|
}
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2000-05-18 22:08:39 +00:00
|
|
|
UBool
|
1999-08-16 21:50:52 +00:00
|
|
|
DateFormat::isLenient() const
|
|
|
|
{
|
2008-02-23 19:15:18 +00:00
|
|
|
if (fCalendar != NULL) {
|
|
|
|
return fCalendar->isLenient();
|
|
|
|
}
|
|
|
|
// fCalendar is rarely null
|
|
|
|
return FALSE;
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
|
2013-09-16 12:45:41 +00:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
DateFormat&
|
|
|
|
DateFormat::setBooleanAttribute(UDateFormatBooleanAttribute attr,
|
|
|
|
UBool newValue,
|
|
|
|
UErrorCode &status) {
|
|
|
|
if(!fBoolFlags.isValidValue(newValue)) {
|
|
|
|
status = U_ILLEGAL_ARGUMENT_ERROR;
|
|
|
|
} else {
|
|
|
|
fBoolFlags.set(attr, newValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
UBool
|
2013-09-18 20:08:25 +00:00
|
|
|
DateFormat::getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &/*status*/) const {
|
2013-09-16 12:45:41 +00:00
|
|
|
|
|
|
|
return fBoolFlags.get(attr);
|
|
|
|
}
|
|
|
|
|
2001-10-08 23:26:58 +00:00
|
|
|
U_NAMESPACE_END
|
|
|
|
|
2002-09-20 01:54:48 +00:00
|
|
|
#endif /* #if !UCONFIG_NO_FORMATTING */
|
|
|
|
|
1999-08-16 21:50:52 +00:00
|
|
|
//eof
|