Должно работать следующее:
Calendar c = new GregorianCalendar();
c.setTime(new Date(0));
c.add(Calendar.DAY_OF_YEAR, 1000);
System.err.println(c.getTime());
Примечание относительно часовых поясов:
Новый экземпляр GregorianCalendar
создается с использованием часового пояса системы по умолчанию, установленного программой.работает на.Поскольку Epoch относится к UTC (GMT в Java), любой часовой пояс, отличный от UTC, должен обрабатываться с осторожностью.Следующая программа иллюстрирует проблему:
TimeZone.setDefault(TimeZone.getTimeZone("GMT-1"));
Calendar c = new GregorianCalendar();
c.setTimeInMillis(0);
System.err.println(c.getTime());
System.err.println(c.get(Calendar.DAY_OF_YEAR));
c.add(Calendar.DAY_OF_YEAR, 1);
System.err.println(c.getTime());
System.err.println(c.get(Calendar.DAY_OF_YEAR));
Это печатает
Wed Dec 31 23:00:00 GMT-01:00 1969
365
Thu Jan 01 23:00:00 GMT-01:00 1970
1
Это демонстрирует, что недостаточно использовать, например, c.get(Calendar.DAY_OF_YEAR)
.В этом случае всегда нужно учитывать, какое сейчас время суток.Этого можно избежать, явно используя GMT при создании GregorianCalendar
: new GregorianCalendar(TimeZone.getTimeZone("GMT"))
.Если календарь создан таким образом, вывод:
Wed Dec 31 23:00:00 GMT-01:00 1969
1
Thu Jan 01 23:00:00 GMT-01:00 1970
2
Теперь календарь возвращает полезные значения.Причина, по которой Date
, возвращаемый c.getTime()
, по-прежнему "выключен", заключается в том, что метод toString()
использует значение по умолчанию TimeZone
для построения строки.Вверху мы установили это на GMT-1, чтобы все было нормально.