Хорошо, теперь у нас есть реальные данные, проблема с вашей начальной датой.
Лично мне легче всего диагностировать подобные вещи с помощью 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 вместо встроенных типов календаря, вы должны ... но вам все равно нужно быть осторожным с применением системного часового пояса по умолчанию, когда Вы не хотите, чтобы это было.