Даты Вы печатаете от Calendar
локальны для Вашего часового пояса, тогда как эпоха определяется, чтобы быть полуночью от 01.01.1970 в UTC. Таким образом, если Вы будете жить в часовом поясе к западу от UTC, то затем Ваша дата обнаружится как 31.12.1969, даже при том, что (в UTC) это все еще 01.01.1970.
Во-первых, c.get(Calendar.MONTH)
возвраты 0 для Jan, 1 на февраль, и т.д.
Во-вторых, использовать DateFormat
производить даты.
В-третьих, Вашими проблемами является яркий пример того, как Дата неловкого Java API. Используйте Время Joda API, если Вы можете. Это сделает Вашу жизнь несколько легче.
Вот лучший пример Вашего кода, который указывает на часовой пояс:
public static void main(String[] args) {
final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
long l = 10000000L;
System.out.println("Long value: " + l);
Calendar c = new GregorianCalendar();
c.setTimeInMillis(l);
System.out.println("Date: " + dateFormat.format(c.getTime()));
l = 1000000000000L;
System.out.println("\nLong value: " + l);
c.setTimeInMillis(l);
System.out.println("Date: " + dateFormat.format(c.getTime()));
}
К сожалению, java.util.Date
и java.util.Calendar
были плохо разработаны, ведя к этому виду беспорядка.
Можно выяснить себя при изменении первого c.setTimeInMillis(l);
в c.clear();
Ваш часовой пояс, скорее всего, отстает от GMT (например, GMT-5), поэтому 10 000 000 мс с эпохи находятся 31 декабря 1969 в Вашем часовом поясе, но так как месяцы основаны на нуле в java.util.Calendar
Ваш Calendar
- преобразование к тексту испорчено, и Вы добираетесь 31.11.1969 вместо ожидаемых 31.12.1969.
Calendar#setTimeInMillis () устанавливает время календаря на количество миллисекунд после Jan 1, 1970 GMT.
Calendar#get () возвращает требуемое поле, скорректированное для часового пояса календаря, который, по умолчанию, является локальным часовым поясом Вашей машины.
Это должно работать, как Вы ожидаете, указываете ли Вы часовой пояс "GMT" при построении календаря:
Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));