blob: 0b7c39882d33c9f8e54b5d0845e18f516bc5a68e [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2012-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.util;
import java.util.Date;
import com.ibm.icu.util.ULocale.Category;
/**
* <code>DangiCalendar</code> is a concrete subclass of {@link Calendar}
* that implements a traditional Korean calendar.
*
* @internal
* @deprecated This API is ICU internal only.
*/
@Deprecated
public class DangiCalendar extends ChineseCalendar {
private static final long serialVersionUID = 8156297445349501985L;
/**
* The start year of the Korean traditional calendar (Dan-gi) is the inaugural
* year of Dan-gun (BC 2333).
*/
private static final int DANGI_EPOCH_YEAR = -2332;
/**
* The time zone used for performing astronomical computations for
* Dangi calendar. In Korea various timezones have been used historically
* (cf. http://www.math.snu.ac.kr/~kye/others/lunar.html):
*
* - 1908/04/01: GMT+8
* 1908/04/01 - 1911/12/31: GMT+8.5
* 1912/01/01 - 1954/03/20: GMT+9
* 1954/03/21 - 1961/08/09: GMT+8.5
* 1961/08/10 - : GMT+9
*
* Note that, in 1908-1911, the government did not apply the timezone change
* but used GMT+8. In addition, 1954-1961's timezone change does not affect
* the lunar date calculation. Therefore, the following simpler rule works:
*
* -1911: GMT+8
* 1912-: GMT+9
*
* Unfortunately, our astronomer's approximation doesn't agree with the
* references (http://www.math.snu.ac.kr/~kye/others/lunar.html and
* http://astro.kasi.re.kr/Life/ConvertSolarLunarForm.aspx?MenuID=115)
* in 1897/7/30. So the following ad hoc fix is used here:
*
* -1896: GMT+8
* 1897: GMT+7
* 1898-1911: GMT+8
* 1912- : GMT+9
*/
private static final TimeZone KOREA_ZONE;
static {
InitialTimeZoneRule initialTimeZone = new InitialTimeZoneRule("GMT+8", 8 * ONE_HOUR, 0);
long[] millis1897 = { (1897 - 1970) * 365L * ONE_DAY }; // some days of error is not a problem here
long[] millis1898 = { (1898 - 1970) * 365L * ONE_DAY }; // some days of error is not a problem here
long[] millis1912 = { (1912 - 1970) * 365L * ONE_DAY }; // this doesn't create an issue for 1911/12/20
TimeZoneRule rule1897 = new TimeArrayTimeZoneRule("Korean 1897", 7 * ONE_HOUR, 0, millis1897,
DateTimeRule.STANDARD_TIME);
TimeZoneRule rule1898to1911 = new TimeArrayTimeZoneRule("Korean 1898-1911", 8 * ONE_HOUR, 0, millis1898,
DateTimeRule.STANDARD_TIME);
TimeZoneRule ruleFrom1912 = new TimeArrayTimeZoneRule("Korean 1912-", 9 * ONE_HOUR, 0, millis1912,
DateTimeRule.STANDARD_TIME);
RuleBasedTimeZone tz = new RuleBasedTimeZone("KOREA_ZONE", initialTimeZone);
tz.addTransitionRule(rule1897);
tz.addTransitionRule(rule1898to1911);
tz.addTransitionRule(ruleFrom1912);
tz.freeze();
KOREA_ZONE = tz;
};
/**
* Construct a <code>DangiCalendar</code> with the default time zone and locale.
*
* @internal
* @deprecated This API is ICU internal only.
*/
@Deprecated
public DangiCalendar() {
this(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
}
/**
* Construct a <code>DangiCalendar</code> with the give date set in the default time zone
* with the default locale.
* @param date The date to which the new calendar is set.
*
* @internal
* @deprecated This API is ICU internal only.
*/
@Deprecated
public DangiCalendar(Date date) {
this(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
setTime(date);
}
/**
* Construct a <code>DangiCalendar</code> based on the current time
* with the given time zone with the given locale.
* @param zone the given time zone
* @param locale the given locale
*
* @internal
* @deprecated This API is ICU internal only.
*/
@Deprecated
public DangiCalendar(TimeZone zone, ULocale locale) {
super(zone, locale, DANGI_EPOCH_YEAR, KOREA_ZONE);
}
/**
* {@inheritDoc}
*
* @internal
* @deprecated This API is ICU internal only.
*/
@Deprecated
public String getType() {
return "dangi";
}
}