Java Calendar объект извлекает неправильную дату? - PullRequest
2 голосов
/ 23 февраля 2011
/**
 * Gets an instance of GMT Calendar.
 *
 * @return a new <code>Calendar</code> object
 */
public static Calendar getGMTCalendar()
{
    return Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
}

/**
 * @return The month (eg. Calenday.MAY) value for the date.
 */
public static int getMonth(Date date)
{
    Calendar c = getGMTCalendar();
    System.out.println("date ::"+date.toString());
    c.setTime(date);
    int month=c.get(Calendar.MONTH);
    System.out.println("date after calendar is set ::"+c.getTime()+",Month="+month);
    return c.get(Calendar.MONTH);
}

Выше приведен фрагмент кода, который я использую. Когда я пытаюсь получить месяц даты, которую я передаю, getMonth (), как

int month = DateUtil.getMonth (date); (дата 10-01-2010)

Месяц, который я ожидаю, это 8 (0 января, 1 февраля ... 8 сентября, 9 октября), но я получаю вот что месяц = ​​8. Я попытался отладки и обнаружил, что в функции getMonth (), когда я установил время с помощью c.setTime (date) дата установлена ​​на 09-31-2010, т.е. за день до даты, прошедшей. Я использую INtellij Idea как идею Может кто-нибудь помочь ??

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Хорошо, теперь у нас есть реальные данные, проблема с вашей начальной датой.

Лично мне легче всего диагностировать подобные вещи с помощью Joda Time:

import org.joda.time.*;

public class Test {

    public static void main(String[] args)
    {
        DateTime dt = new DateTime(1285871400000L,
                                   DateTimeZone.UTC);
        System.out.println(dt);
    }
}

Это определенно покажет все в UTC ... и напечатает 2010-09-30T18: 30: 00.000Z. Таким образом, момент, когда вы переходите в календарь, - это сентябрь, а не октябрь Это дает вам правильный результат для данных, которые вы предоставляете, так как вы указали часовой пояс GMT - вы просто не даете ему данные, которые вы думали.

Вы должны понимать, что Date просто представляет мгновенный во времени, без ссылки на систему календаря или часовой пояс. Таким образом, хотя это значение даты было напечатано 1 октября для вас из-за вашего часового пояса по умолчанию, на самом деле это момент времени, который наступает вечером 30 сентября в UTC в календаре ISO.

Если честно, если вы можете использовать Joda Time вместо встроенных типов календаря, вы должны ... но вам все равно нужно быть осторожным с применением системного часового пояса по умолчанию, когда Вы не хотите, чтобы это было.

0 голосов
/ 23 февраля 2011

Если вы находитесь в часовом поясе с отрицательным смещением (например, в США) и устанавливаете дату GMT в качестве первого дня месяца со временем 00:00:00, местное время будет в предыдущемдень (и предыдущий месяц).Убедитесь, что вы не извлекаете местное время из объекта Calendar.

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