com.ibm.icu.util.TaiwanCalendar Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of icu4j Show documentation
Show all versions of icu4j Show documentation
International Component for Unicode for Java (ICU4J) is a mature, widely used Java library
providing Unicode and Globalization support
/*
*******************************************************************************
* Copyright (C) 1996-2010, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.util;
import java.util.Date;
import java.util.Locale;
/**
* TaiwanCalendar
is a subclass of GregorianCalendar
* that numbers years since 1912.
*
* The Taiwan calendar is identical to the Gregorian calendar in all respects
* except for the year and era. Years are numbered since 1912 AD (Gregorian).
*
* The Taiwan Calendar has one era: MINGUO
.
*
* This class should not be subclassed.
*
* TaiwanCalendar usually should be instantiated using
* {@link com.ibm.icu.util.Calendar#getInstance(ULocale)} passing in a ULocale
* with the tag "@calendar=roc"
.
*
* @see com.ibm.icu.util.Calendar
* @see com.ibm.icu.util.GregorianCalendar
*
* @author Laura Werner
* @author Alan Liu
* @author Steven R. Loomis
* @stable ICU 3.8
*/
public class TaiwanCalendar extends GregorianCalendar {
// jdk1.4.2 serialver
private static final long serialVersionUID = 2583005278132380631L;
//-------------------------------------------------------------------------
// Constructors...
//-------------------------------------------------------------------------
/**
* Constant for the Taiwan Era for years before Minguo 1.
* Brefore Minuo 1 is Gregorian 1911, Before Minguo 2 is Gregorian 1910
* and so on.
*
* @see com.ibm.icu.util.Calendar#ERA
* @stable ICU 3.8
*/
public static final int BEFORE_MINGUO = 0;
/**
* Constant for the Taiwan Era for Minguo. Minguo 1 is 1912 in
* Gregorian calendar.
*
* @see com.ibm.icu.util.Calendar#ERA
* @stable ICU 3.8
*/
public static final int MINGUO = 1;
/**
* Constructs a TaiwanCalendar
using the current time
* in the default time zone with the default locale.
* @stable ICU 3.8
*/
public TaiwanCalendar() {
super();
}
/**
* Constructs a TaiwanCalendar
based on the current time
* in the given time zone with the default locale.
*
* @param zone the given time zone.
* @stable ICU 3.8
*/
public TaiwanCalendar(TimeZone zone) {
super(zone);
}
/**
* Constructs a TaiwanCalendar
based on the current time
* in the default time zone with the given locale.
*
* @param aLocale the given locale.
* @stable ICU 3.8
*/
public TaiwanCalendar(Locale aLocale) {
super(aLocale);
}
/**
* Constructs a TaiwanCalendar
based on the current time
* in the default time zone with the given locale.
*
* @param locale the given ulocale.
* @stable ICU 3.8
*/
public TaiwanCalendar(ULocale locale) {
super(locale);
}
/**
* Constructs a TaiwanCalendar
based on the current time
* in the given time zone with the given locale.
*
* @param zone the given time zone.
*
* @stable ICU 3.8
*/
public TaiwanCalendar(TimeZone zone, Locale aLocale) {
super(zone, aLocale);
}
/**
* Constructs a TaiwanCalendar
based on the current time
* in the given time zone with the given locale.
*
* @param zone the given time zone.
* @param locale the given ulocale.
* @stable ICU 3.8
*/
public TaiwanCalendar(TimeZone zone, ULocale locale) {
super(zone, locale);
}
/**
* Constructs a TaiwanCalendar
with the given date set
* in the default time zone with the default locale.
*
* @param date The date to which the new calendar is set.
* @stable ICU 3.8
*/
public TaiwanCalendar(Date date) {
this();
setTime(date);
}
/**
* Constructs a TaiwanCalendar
with the given date set
* in the default time zone with the default locale.
*
* @param year The value used to set the calendar's {@link #YEAR YEAR} time field.
*
* @param month The value used to set the calendar's {@link #MONTH MONTH} time field.
* The value is 0-based. e.g., 0 for January.
*
* @param date The value used to set the calendar's {@link #DATE DATE} time field.
* @stable ICU 3.8
*/
public TaiwanCalendar(int year, int month, int date) {
super(year, month, date);
}
/**
* Constructs a TaiwanCalendar with the given date
* and time set for the default time zone with the default locale.
*
* @param year The value used to set the calendar's {@link #YEAR YEAR} time field.
*
* @param month The value used to set the calendar's {@link #MONTH MONTH} time field.
* The value is 0-based. e.g., 0 for January.
* @param date The value used to set the calendar's {@link #DATE DATE} time field.
* @param hour The value used to set the calendar's {@link #HOUR_OF_DAY HOUR_OF_DAY} time field.
* @param minute The value used to set the calendar's {@link #MINUTE MINUTE} time field.
* @param second The value used to set the calendar's {@link #SECOND SECOND} time field.
* @stable ICU 3.8
*/
public TaiwanCalendar(int year, int month, int date, int hour,
int minute, int second)
{
super(year, month, date, hour, minute, second);
}
//-------------------------------------------------------------------------
// The only practical difference from a Gregorian calendar is that years
// are numbered since 1912, inclusive. A couple of overrides will
// take care of that....
//-------------------------------------------------------------------------
private static final int Taiwan_ERA_START = 1911; // 0=1911, 1=1912
// Use 1970 as the default value of EXTENDED_YEAR
private static final int GREGORIAN_EPOCH = 1970;
/**
* {@inheritDoc}
* @stable ICU 3.8
*/
protected int handleGetExtendedYear() {
// EXTENDED_YEAR in TaiwanCalendar is a Gregorian year
// The default value of EXTENDED_YEAR is 1970 (Minguo 59)
int year = GREGORIAN_EPOCH;
if (newerField(EXTENDED_YEAR, YEAR) == EXTENDED_YEAR
&& newerField(EXTENDED_YEAR, ERA) == EXTENDED_YEAR) {
year = internalGet(EXTENDED_YEAR, GREGORIAN_EPOCH);
} else {
int era = internalGet(ERA, MINGUO);
if (era == MINGUO) {
year = internalGet(YEAR, 1) + Taiwan_ERA_START;
} else {
year = 1 - internalGet(YEAR, 1) + Taiwan_ERA_START;
}
}
return year;
}
/**
* {@inheritDoc}
* @stable ICU 3.8
*/
protected void handleComputeFields(int julianDay) {
super.handleComputeFields(julianDay);
int y = internalGet(EXTENDED_YEAR) - Taiwan_ERA_START;
if (y > 0) {
internalSet(ERA, MINGUO);
internalSet(YEAR, y);
} else {
internalSet(ERA, BEFORE_MINGUO);
internalSet(YEAR, 1- y);
}
}
/**
* Override GregorianCalendar. There is only one Taiwan ERA. We
* should really handle YEAR, YEAR_WOY, and EXTENDED_YEAR here too to
* implement the 1..5000000 range, but it's not critical.
* @stable ICU 3.8
*/
protected int handleGetLimit(int field, int limitType) {
if (field == ERA) {
if (limitType == MINIMUM || limitType == GREATEST_MINIMUM) {
return BEFORE_MINGUO;
} else {
return MINGUO;
}
}
return super.handleGetLimit(field, limitType);
}
/**
* {@inheritDoc}
* @stable ICU 3.8
*/
public String getType() {
return "roc";
}
}