Android java.util.Calendar - różnica czasu

Chcę utworzyć widok kalendarza w celu obsługi interakcji dotykowych. Chciałbym więc zbudować nowy niestandardowy widok kalendarza. Próbowałem utworzyć funkcję mapowania między przesunięciem widoku a rzeczywistą wartością daty.

Oto mój pomysł: jeśli mogę obliczyć liczbę tygodni od daty bazowej (w moim przypadku, 1989-12-31), łatwo jest znać przesunięcie. HEIGHT_FOR_WEEK * NUM_OF_WEEK to bardzo proste obliczenie, aby znać dokładne przesunięcie.

Mój problem jest następujący: najpierw otrzymałem wartość milisekund od daty bazowej. I ustawiam milisekundy na inny obiekt kalendarza. Spodziewałem się tej samej daty z tego obiektu. Ale w rzeczywistości była to inna data.

mBaseDateInMillis = mBaseDate.getTimeInMillis();
mAnotherDate.setTimeInMillis(mBaseDateInMillis);
/* I expect mBaseDate == mAnotherDate.
 * but it was different.
 */ 

Oto mój kod:

public class CalendarCoordinate {
    public static final long ONEWEEK_IN_MILLISECONDS = 60 * 60 * 24 * 7 * 1000;
    public Calendar mBaseDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
    public long mBaseDateInMillis = 0;
    public Calendar mDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
    public int  mWeekHeight = 30;

    /**
     * CTOR
     */
    public CalendarCoordinate() {
        /* Base date is 1989-12-31 0, 0, 0
         * It was Sunday and offset 0 will be mapped onto this day.
         */
        mBaseDate.set(Calendar.MILLISECOND, 0);
        mBaseDate.set(1989, 12, 31, 0, 0, 0);
        mBaseDateInMillis = mBaseDate.getTimeInMillis();
        Log.v(TAG, "BaseDate:" + mBaseDate.toString());
    }

    /**
     * Compute DATE from Y-Offset
     * @param yOffset
     * @return
     */
     public Calendar dateFromYOffset(int yOffset) {
        long nthWeeks = yOffset / mWeekHeight;
        long millsSinceBaseDate = nthWeeks * ONEWEEK_IN_MILLISECONDS;
        mDate.clear();
        mDate.set(Calendar.MILLISECOND, 0);
        mDate.setTimeInMillis(mBaseDateInMillis + millsSinceBaseDate);

        /* We SHOULD call to update mDate internal data structure. 
         * Java is really strange for this thing
         **/
        mDate.getTimeInMillis();
        return mDate;
    }

    /**
     * Compute Y-Offset from DATE
     * @param date
     * @return
     */
    public long yOffsetFromDate(Calendar cal) {
        long mills = cal.getTimeInMillis();
        long nthWeeks = (mills - mBaseDateInMillis)/ONEWEEK_IN_MILLISECONDS;
        return nthWeeks * mWeekHeight;
    }
}

Ktoś może mi pomóc? Nie jestem dobrym programistą Java.

questionAnswers(3)

yourAnswerToTheQuestion