151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.util.calendar; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.TimeZone; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Julian calendar implementation. 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Masayoshi Okutsu 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class JulianCalendar extends BaseCalendar { 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final int BCE = 0; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final int CE = 1; 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final Era[] eras = { 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new Era("BeforeCommonEra", "B.C.E.", Long.MIN_VALUE, false), 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new Era("CommonEra", "C.E.", -62135709175808L, true) 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final int JULIAN_EPOCH = -1; 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static class Date extends BaseCalendar.Date { 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Date() { 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(); 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setCache(1, -1L, 365); // January 1, 1 CE (Julian) 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Date(TimeZone zone) { 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(zone); 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setCache(1, -1L, 365); // January 1, 1 CE (Julian) 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date setEra(Era era) { 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (era == null) { 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (era != eras[0] || era != eras[1]) { 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("unknown era: " + era); 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.setEra(era); 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this; 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void setKnownEra(Era era) { 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super.setEra(era); 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getNormalizedYear() { 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (getEra() == eras[BCE]) { 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 1 - getYear(); 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getYear(); 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Use the year numbering ..., -2, -1, 0, 1, 2, ... for 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // normalized years. This differs from "Calendrical 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Calculations" in which the numbering is ..., -2, -1, 1, 2, 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // ... 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setNormalizedYear(int year) { 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (year <= 0) { 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setYear(1 - year); 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setKnownEra(eras[BCE]); 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setYear(year); 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setKnownEra(eras[CE]); 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String time = super.toString(); 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski time = time.substring(time.indexOf('T')); 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringBuffer sb = new StringBuffer(); 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Era era = getEra(); 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (era != null) { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String n = era.getAbbreviation(); 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (n != null) { 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append(n).append(' '); 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append(getYear()).append('-'); 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CalendarUtils.sprintf0d(sb, getMonth(), 2).append('-'); 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CalendarUtils.sprintf0d(sb, getDayOfMonth(), 2); 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sb.append(time); 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sb.toString(); 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JulianCalendar() { 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setEras(eras); 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getName() { 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return "julian"; 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date getCalendarDate() { 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getCalendarDate(System.currentTimeMillis(), newCalendarDate()); 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date getCalendarDate(long millis) { 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getCalendarDate(millis, newCalendarDate()); 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date getCalendarDate(long millis, CalendarDate date) { 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (Date) super.getCalendarDate(millis, date); 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date getCalendarDate(long millis, TimeZone zone) { 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getCalendarDate(millis, newCalendarDate(zone)); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date newCalendarDate() { 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Date(); 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date newCalendarDate(TimeZone zone) { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Date(zone); 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param jyear normalized Julian year 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public long getFixedDate(int jyear, int month, int dayOfMonth, BaseCalendar.Date cache) { 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean isJan1 = month == JANUARY && dayOfMonth == 1; 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Look up the one year cache 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cache != null && cache.hit(jyear)) { 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isJan1) { 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return cache.getCachedJan1(); 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return cache.getCachedJan1() + getDayOfYear(jyear, month, dayOfMonth) - 1; 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long y = jyear; 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long days = JULIAN_EPOCH - 1 + (365 * (y - 1)) + dayOfMonth; 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (y > 0) { 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // CE years 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski days += (y - 1) / 4; 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // BCE years 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski days += CalendarUtils.floorDivide(y - 1, 4); 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (month > 0) { 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski days += ((367 * (long) month) - 362) / 12; 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski days += CalendarUtils.floorDivide((367 * (long) month) - 362, 12); 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (month > FEBRUARY) { 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski days -= CalendarUtils.isJulianLeapYear(jyear) ? 1 : 2; 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // If it's January 1, update the cache. 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cache != null && isJan1) { 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cache.setCache(jyear, days, CalendarUtils.isJulianLeapYear(jyear) ? 366 : 365); 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return days; 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void getCalendarDateFromFixedDate(CalendarDate date, long fixedDate) { 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Date jdate = (Date) date; 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long fd = 4 * (fixedDate - JULIAN_EPOCH) + 1464; 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int year; 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (fd >= 0) { 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski year = (int)(fd / 1461); 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski year = (int) CalendarUtils.floorDivide(fd, 1461); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int priorDays = (int)(fixedDate - getFixedDate(year, JANUARY, 1, jdate)); 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean isLeap = CalendarUtils.isJulianLeapYear(year); 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (fixedDate >= getFixedDate(year, MARCH, 1, jdate)) { 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski priorDays += isLeap ? 1 : 2; 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int month = 12 * priorDays + 373; 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (month > 0) { 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski month /= 367; 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski month = CalendarUtils.floorDivide(month, 367); 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int dayOfMonth = (int)(fixedDate - getFixedDate(year, month, 1, jdate)) + 1; 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int dayOfWeek = getDayOfWeekFromFixedDate(fixedDate); 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski assert dayOfWeek > 0 : "negative day of week " + dayOfWeek; 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jdate.setNormalizedYear(year); 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jdate.setMonth(month); 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jdate.setDayOfMonth(dayOfMonth); 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jdate.setDayOfWeek(dayOfWeek); 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jdate.setLeapYear(isLeap); 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jdate.setNormalized(true); 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the normalized Julian year number of the given fixed date. 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getYearFromFixedDate(long fixedDate) { 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int year = (int) CalendarUtils.floorDivide(4 * (fixedDate - JULIAN_EPOCH) + 1464, 1461); 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return year; 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getDayOfWeek(CalendarDate date) { 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // TODO: should replace this with a faster calculation, such 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // as cache table lookup 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long fixedDate = getFixedDate(date); 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getDayOfWeekFromFixedDate(fixedDate); 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean isLeapYear(int jyear) { 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return CalendarUtils.isJulianLeapYear(jyear); 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 235