Android java.util.Calendar - Zeitverschiebung

Ich möchte eine Kalenderansicht erstellen, um die Touch-Interaktion zu unterstützen. Daher möchte ich eine neue benutzerdefinierte Kalenderansicht erstellen. Ich habe versucht, eine Zuordnungsfunktion zwischen dem Ansichtsoffset und dem tatsächlichen Datumswert zu erstellen.

Hier ist meine Idee: Wenn ich die Anzahl der Wochen seit dem Basisdatum berechnen kann (in meinem Fall 1989-12-31), ist es einfach zu wissen, Offset. HEIGHT_FOR_WEEK * NUM_OF_WEEK ist eine sehr einfache Berechnung, um den genauen Versatz zu ermitteln.

Mein Problem ist folgendes: Zuerst habe ich den Millisekundenwert vom Basisdatum abgerufen. Und ich habe die Millisekunden auf ein anderes Kalenderobjekt gesetzt. Ich habe dasselbe Datum von diesem Objekt erwartet. Aber eigentlich war es ein anderes Datum.

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

Hier ist mein Code:

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;
    }
}

Kann mir jemand helfen? Ich bin kein guter Java-Programmierer.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage