Почему calendar.isSet (field) изменяется на true при вызове многих других методов? - PullRequest
3 голосов
/ 28 апреля 2011

У меня есть проект, в котором метод isSet календаря был бы очень полезен, но между очисткой поля и чтением флага isSet для этого поля мне нужно вызвать другой метод календаря, на который влияет эта проблема.

Вот пример, чтобы продемонстрировать, что происходит:

Calendar cal = Calendar.getInstance();
Log.d(TAG, Boolean.toString(cal.isSet(Calendar.SECOND))); // true
cal.clear(Calendar.SECOND);
Log.d(TAG, Boolean.toString(cal.isSet(Calendar.SECOND))); // false
cal.getTimeInMillis();
// These other methods I've tried, and I'm sure many more, have the same affect on isSet:
// before(calendar), compareTo(calendar), get(field), add(field, int), set(field, int)
// Note: 'field' in above comment line refers to a field other than Calendar.SECOND
Log.d(TAG, Boolean.toString(cal.isSet(Calendar.SECOND))); // true

Я посмотрел на источник для класса Calendar, и я не вижу причины этого. Кто-нибудь знает, почему это происходит? Нужно ли отслеживать заданные поля отдельно?

Обновление:
Похоже, что эта проблема может быть связана с Android или с конкретной версией Java, так как несколько респондентов заявили, что она работает для них в стандартной Java. Просто чтобы прояснить, класс, который я использую, по-прежнему java.util.Calendar. В случае, если информация может помочь, я строю против платформы Android 2.2 (API 8).

Обновление 2:
По словам кого-то из # android-dev о FreeNode и моих последующих исследований в Википедии, это, вероятно, связано с тем, что Dalvik использует подмножество Harmony (реализация Java) для своей библиотеки классов вместо Java. Однако это заставляет меня задуматься, почему Harmony меняет поведение isSet. Излишне говорить, что эта проблема звучит так, как будто она слишком далеко вверх по течению, чтобы в ближайшее время было исправление в Android SDK, поэтому мне придется согласиться с обходным решением.

Я оставлю вопрос открытым, так как он еще не получил правильного ответа. Это ошибка в гармонии, как я подозреваю, или намеренный дизайн? Если намеренно, какова цель и есть ли способ использовать это, как я хочу использовать?

Обновление 3:
Я разместил проблему на трекере для Android, чтобы подождать и посмотреть, что из этого получится. Пожалуйста, отметьте это, если эта проблема также является проблемой для вас. Я надеюсь, что у Android есть своя форк Harmony, и ему не нужно ждать исправления вверх по течению.
https://code.google.com/p/android/issues/detail?id=16826

Также удален тег java, поскольку это явно не проблема Java.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011

Работает, как и ожидалось для меня ..

Вот код, который я использовал

import java.util.Calendar;

открытый класс Test {

/**
 * @param args
 */
public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    System.out.println(Boolean.toString(cal.isSet(Calendar.SECOND)));
    cal.clear(Calendar.SECOND);
    System.out.println(Boolean.toString(cal.isSet(Calendar.SECOND)));
    cal.getTimeInMillis();
    System.out.println(Boolean.toString(cal.isSet(Calendar.SECOND)));
}

}

А вот и здесь вывод в консоли

правда

ложь

ложь

Спасибо

0 голосов
/ 28 апреля 2011

Работает как положено для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...