Android java.util.Calendar - 时差

pop*_*ome 2 java datetime android

我想制作日历视图以支持触摸交互.所以我想构建新的自定义日历视图.我试图在视图偏移和实际日期值之间建立映射函数.

这是我的想法:如果我可以计算自基准日期以来的周数(在我的情况下,1989-12-31),很容易知道偏移量.HEIGHT_FOR_WEEK*NUM_OF_WEEK是非常简单的计算,可以知道精确的偏移量.

我的问题是:首先我从基准日期获得毫秒值.我将毫秒设置为另一个日历对象.我期望该对象的日期相同.但实际上它是不同的日期.

mBaseDateInMillis = mBaseDate.getTimeInMillis();
mAnotherDate.setTimeInMillis(mBaseDateInMillis);
/* I expect mBaseDate == mAnotherDate.
 * but it was different.
 */ 
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?我不是一个优秀的Java程序员.

jsi*_*ght 5

这句话让我很困惑:

/* I expect mBaseDate == mAnotherDate.
 * but it was different.
 */
Run Code Online (Sandbox Code Playgroud)

你是否真的试图通过比较来检查相等性:if(mBaseDate == mAnotherDate){System.out.println("它们是相同的"); }

如果是这样,那么您的问题是您误解了"=="运算符在Java中的工作原理.它比较引用,而不是比较底层对象数据,因为它们是不同的对象(具有相同的值),它们总是为假.有关更多详细信息,请参阅有关比较运算符Java Notes.

此外,这些线条对我来说真的很可疑:

/* We SHOULD call to update mDate internal data structure. 
* Java is really strange for this thing
**/
mDate.getTimeInMillis();
Run Code Online (Sandbox Code Playgroud)

如果Android有一个错误要求你这样做,我真的会感到惊讶,但我想任何事都有可能.没有这个电话,你有什么问题?