/* Generated automatically by jlpp - do not edit. */ #include static jakelib::lang::String* jakelib2_strings[] = {null, null, null, null, null, null, null}; // "Field=" static jchar chars_jakelib2_str_0[] = {70,105,101,108,100,61}; // "jakelib.util.GregorianCalendar.add" static jchar chars_jakelib2_str_1[] = {106,97,107,101,108,105,98,46,117,116,105,108,46,71,114,101,103,111,114,105,97,110,67,97,108,101,110,100,97,114,46,97,100,100}; // "jakelib.util.GregorianCalendar.roll" static jchar chars_jakelib2_str_2[] = {106,97,107,101,108,105,98,46,117,116,105,108,46,71,114,101,103,111,114,105,97,110,67,97,108,101,110,100,97,114,46,114,111,108,108}; // "Field=" static jchar chars_jakelib2_str_3[] = {70,105,101,108,100,61}; // "jakelib.util.GregorianCalendar.getMinimum" static jchar chars_jakelib2_str_4[] = {106,97,107,101,108,105,98,46,117,116,105,108,46,71,114,101,103,111,114,105,97,110,67,97,108,101,110,100,97,114,46,103,101,116,77,105,110,105,109,117,109}; // "Field=" static jchar chars_jakelib2_str_5[] = {70,105,101,108,100,61}; // "jakelib.util.GregorianCalendar.getMaximum" static jchar chars_jakelib2_str_6[] = {106,97,107,101,108,105,98,46,117,116,105,108,46,71,114,101,103,111,114,105,97,110,67,97,108,101,110,100,97,114,46,103,101,116,77,97,120,105,109,117,109}; #line 1 "util/GregorianCalendar.jlc" // -*- c++ -*- /* * Jakelib2 - General purpose C++ library * Copyright (C) 2001 Florian Wolff (florian@donuz.de) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: GregorianCalendar.jlc,v 1.25 2003/09/27 08:10:29 florian Exp $ */ #include "jakelib2.h" #include "jakelib2/lang/System.h" #include "jakelib2/util/GregorianCalendar.h" #include "jakelib2/util/Date.h" #include "jakelib2/util/TimeZone.h" #include "jakelib2/util/Locale.h" using namespace jakelib::lang; using namespace jakelib::util; JAKELIB_IMPLEMENT_CLASS("jakelib.util.GregorianCalendar", GregorianCalendar, Calendar); #ifdef MSVC # define MILLIS_PER_DAY (24L * 60L * 60L * 1000L) # define MILLIS_PER_HOUR ( 60L * 60L * 1000L) # define MILLIS_PER_MINUTE ( 60L * 1000L) # define MILLIS_PER_SECOND ( 1000L) #else # define MILLIS_PER_DAY (24LL * 60LL * 60LL * 1000LL) # define MILLIS_PER_HOUR ( 60LL * 60LL * 1000LL) # define MILLIS_PER_MINUTE ( 60LL * 1000LL) # define MILLIS_PER_SECOND ( 1000LL) #endif //#pragma javasyntax #define GREGORIAN_CHANGE_YEAR 1582 const jint daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /*****************************************************************************\ * GregorianCalendar | *****************************************************************************/ GregorianCalendar::GregorianCalendar() { time = System::currentTimeMillis(); isTimeSet = true; } GregorianCalendar::GregorianCalendar(jlong millis) { time = millis; isTimeSet = true; } GregorianCalendar::GregorianCalendar(jint year, jint month, jint date, jint hour, jint minute, jint second) { set(year, month, date, hour, minute, second); set(MILLISECOND, 0); areFieldsSet = true; } /*****************************************************************************\ * computeFields | *****************************************************************************/ void GregorianCalendar::computeFields() { time_t t = (time_t)(time / MILLIS_PER_SECOND); struct tm *tm = gmtime(&t); fields[YEAR] = 1900 + tm->tm_year; fields[MONTH] = tm->tm_mon; fields[DATE] = tm->tm_mday; fields[HOUR_OF_DAY] = tm->tm_hour; fields[HOUR] = fields[HOUR_OF_DAY] % 12; if (fields[HOUR_OF_DAY] >= 12) { fields[AM_PM] = PM; } else { fields[AM_PM] = AM; } fields[MINUTE] = tm->tm_min; fields[SECOND] = tm->tm_sec; fields[MILLISECOND] = (jint)(time % MILLIS_PER_SECOND); fields[DAY_OF_WEEK] = tm->tm_wday +1; fields[DAY_OF_YEAR] = tm->tm_yday; fieldSet[YEAR] = true; fieldSet[MONTH] = true; fieldSet[DATE] = true; fieldSet[HOUR_OF_DAY] = true; fieldSet[HOUR] = true; fieldSet[AM_PM] = true; fieldSet[MINUTE] = true; fieldSet[SECOND] = true; fieldSet[MILLISECOND] = true; fieldSet[DAY_OF_WEEK] = true; fieldSet[DAY_OF_YEAR] = true; time_t t2 = mktime(tm); time = ((jlong) t2) * MILLIS_PER_SECOND; // // Add time zone offset here: // jlong localTime = time + 0; // int day = (int)(localTime / MILLIS_PER_DAY); // jlong millisInDay = localTime % MILLIS_PER_DAY; // if (millisInDay < 0) { // millisInDay += MILLIS_PER_DAY; // day --; // } // // DAY_OF_WEEK: // // the epoch starts with Thursday. // int weekday = (day + THURSDAY) % 7; // if (weekday <= 0) // weekday += 7; // fields[DAY_OF_WEEK] = weekday; // fieldSet[DAY_OF_WEEK] = true; // // First approximation of years since 1970: // jint yearsSince1970 = (jint) ((jfloat) day / 365.2425); // if (yearsSince1970 >= 0) { // // YEAR: // int exactDays = yearsSince1970 * 365 + leapYearsSince1970(yearsSince1970 + 1970 -1); // int diff = day - exactDays; // if (diff < 0) { // yearsSince1970 --; // exactDays = yearsSince1970 * 365 + leapYearsSince1970(yearsSince1970 + 1970 -1); // } // else if (diff >= 365 + isLeapYear(yearsSince1970 + 1970)) { // yearsSince1970 ++; // exactDays = yearsSince1970 * 365 + leapYearsSince1970(yearsSince1970 + 1970 -1); // } // int year = yearsSince1970 + 1970; // fields[YEAR] = year; // fieldSet[YEAR] = true; // jboolean leapYear = isLeapYear(year); // int remainingDays = day - exactDays; // // DAY_OF_YEAR: // fields[DAY_OF_YEAR] = remainingDays +1; // fieldSet[DAY_OF_YEAR] = true; // // MONTH: // int month = 0; // for (int m = 0; m < 12; m++) { // int days = daysInMonth[m]; // if (m == FEBRUARY && leapYear) // days ++; // if (remainingDays >= days) { // remainingDays -= days; // month ++; // } // else { // break; // } // } // fields[MONTH] = month; // fieldSet[MONTH] = true; // // DAY_OF_MONTH = DATE: // fields[DAY_OF_MONTH] = remainingDays +1; // fieldSet[DAY_OF_MONTH] = true; // } areFieldsSet = true; } /*****************************************************************************\ * computeTime | *****************************************************************************/ void GregorianCalendar::computeTime() { struct tm tm; tm.tm_year = fields[YEAR] - 1900; tm.tm_mon = fields[MONTH]; tm.tm_mday = fields[DATE]; tm.tm_hour = fields[HOUR_OF_DAY]; tm.tm_min = fields[MINUTE]; tm.tm_sec = fields[SECOND]; time_t t = mktime(&tm); time = ((jlong) t) * MILLIS_PER_SECOND; // int year = fields[YEAR]; // if (year >= 1970) { // time = MILLIS_PER_DAY * (jlong)(365 * (year -1970) // + leapYearsSince1970(year -1)); // for (int m = 0; m < fields[MONTH]; m++) { // time += (jlong)daysInMonth[m] * MILLIS_PER_DAY; // if (m == FEBRUARY && isLeapYear(year)) // time += MILLIS_PER_DAY; // } // time += ((jlong) (fields[DATE] -1)) * MILLIS_PER_DAY // + fields[HOUR] * MILLIS_PER_HOUR // + fields[MINUTE] * MILLIS_PER_MINUTE // + fields[SECOND] * MILLIS_PER_SECOND; // } // else { // } isTimeSet = true; } /*****************************************************************************\ * add | *****************************************************************************/ void GregorianCalendar::add(Field field, jint amount) { if (amount != 0) { complete(); switch (field) { case MONTH: fields[MONTH] += amount; if (fields[MONTH] < 0) { fields[YEAR] += ((fields[MONTH] +1) / 12) -1; fields[MONTH] %= 12; if (fields[MONTH] < 0) fields[MONTH] += 12; } else if (fields[MONTH] > 11) { fields[YEAR] =+ fields[MONTH] / 12; fields[MONTH] = fields[MONTH] % 12; } isTimeSet = false; break; case YEAR: fields[YEAR] =+ amount; isTimeSet = false; break; case DATE: case DAY_OF_YEAR: case DAY_OF_WEEK: time += 24 * 60 * 60 * 1000; areFieldsSet = false; break; default: throw new IllegalArgumentException(JAKELIB_ONDEMAND(jakelib2_strings[0], new jakelib::lang::String(chars_jakelib2_str_0, 0, 6))->plus(field )->plus( JAKELIB_AT2(JAKELIB_ONDEMAND(jakelib2_strings[1], new jakelib::lang::String(chars_jakelib2_str_1, 0, 34))))); } } } /*****************************************************************************\ * roll | *****************************************************************************/ void GregorianCalendar::roll(Field field, jboolean up) { throw new UnsupportedOperationException(JAKELIB_AT2(JAKELIB_ONDEMAND(jakelib2_strings[2], new jakelib::lang::String(chars_jakelib2_str_2, 0, 35)))); } /*****************************************************************************\ * getMinimum | *****************************************************************************/ jint GregorianCalendar::getMinimum(Field field) { switch(field) { case DAY_OF_MONTH: return 1; case MONTH: case HOUR: case HOUR_OF_DAY: case MINUTE: case SECOND: case DAY_OF_WEEK: return 0; default: throw new IllegalArgumentException(JAKELIB_ONDEMAND(jakelib2_strings[3], new jakelib::lang::String(chars_jakelib2_str_3, 0, 6)) ->plus( field )->plus( JAKELIB_AT2(JAKELIB_ONDEMAND(jakelib2_strings[4], new jakelib::lang::String(chars_jakelib2_str_4, 0, 41))))); } } /*****************************************************************************\ * getMaximum | *****************************************************************************/ jint GregorianCalendar::getMaximum(Field field) { switch(field) { case DAY_OF_MONTH: return 31; case MONTH: return 11; case HOUR: return 11; case HOUR_OF_DAY: return 23; case MINUTE: return 59; case SECOND: return 59; case DAY_OF_WEEK: return 6; default: throw new IllegalArgumentException(JAKELIB_ONDEMAND(jakelib2_strings[5], new jakelib::lang::String(chars_jakelib2_str_5, 0, 6)) ->plus( field )->plus( JAKELIB_AT2(JAKELIB_ONDEMAND(jakelib2_strings[6], new jakelib::lang::String(chars_jakelib2_str_6, 0, 41))))); } } /*****************************************************************************\ * getGreatestMinimum | *****************************************************************************/ jint GregorianCalendar::getGreatestMinimum(Field field) { return getMinimum(field); } /*****************************************************************************\ * getLeastMaximum | *****************************************************************************/ jint GregorianCalendar::getLeastMaximum(Field field) { if (field == DAY_OF_MONTH) { return 28; } else { return getMaximum(field); } } /*****************************************************************************\ * getActualMinimum | *****************************************************************************/ jint GregorianCalendar::getActualMinimum(Field field) { return getMinimum(field); } /*****************************************************************************\ * getActualMaximum | *****************************************************************************/ jint GregorianCalendar::getActualMaximum(Field field) { complete(); switch(field) { case DAY_OF_MONTH: if (fields[MONTH] == FEBRUARY && isLeapYear(fields[YEAR])) return 29; else return daysInMonth[fields[MONTH]]; default: return getMaximum(field); } } /*****************************************************************************\ * isLeapYear | *****************************************************************************/ jboolean GregorianCalendar::isLeapYear(jint year) { return ((year % 4) == 0) && (((year % 100) != 0) || ((year % 400) == 0) || year < GREGORIAN_CHANGE_YEAR); } /*****************************************************************************\ * leapYearsSince1970 | *****************************************************************************/ jint GregorianCalendar::leapYearsSince1970(jint year) { if (year >= 1970) { return (year/4) - (year/100) + (year/400) - 477; } else { return 0; } } /*****************************************************************************\ * getGregorianChange | *****************************************************************************/ /*Date* GregorianCalendar::getGregorianChange() { return new Date(GREGORIAN_CHANGE_TIME); }*/