java - Android java.util.Calendar - 时差

标签 java android datetime

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

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

我的问题是: 首先我从基准日期得到毫秒值。我将毫秒设置为 另一个日历对象。我预计该对象的日期相同。但实际上 这是不同的日期。

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

这是我的代码:

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

谁能帮帮我?我不是一个优秀的 Java 程序员。

最佳答案

这句话让我感到困惑:

/* I expect mBaseDate == mAnotherDate.
 * but it was different.
 */

您实际上是在尝试通过比较来检查是否相等: if (mBaseDate == mAnotherDate) { System.out.println("它们是一样的");

如果是这样,您的问题是您误解了“==”运算符在 Java 中的工作方式。它比较引用,而不是比较底层对象数据,并且由于这些是不同的对象(具有相同的值),因此它们始终为假。有关更多详细信息,请参阅 Java Notes on comparison operators .

此外,这些行在我看来真的很可疑:

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

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

关于java - Android java.util.Calendar - 时差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198068/

相关文章:

java - 内部类中的两个声明的构造函数

java - 我们可以在属性文件中设置JTA数据源名称吗

android - 数据 Intent : Pathpattern

datetime - VBScript 是否有 DateTime.TryParse 等价物?

javascript - 如何将 Highcharts 日期时间 x 轴与我传递给它的数据对齐?

Java邮件API : Read only latest replied message from mail body

java - 从数据库列填充 ListView 而不重复值

启动进程时 Java Android ping IOException "Too many files open"

Python时间转换h :m:s to seconds

java - 从 1 到 20 查找 lcm,给出错误 "at Main.gcd(Main.java:21)"