Получить java.util.Calendar от дней с эпохи - PullRequest
5 голосов
/ 23 мая 2011

У меня есть переменная, содержащая дни с эпохальной ссылки из 1970-01-01 на определенную дату.

Кто-нибудь знает способ преобразования этой переменной в java.util.Calendar?

Ответы [ 3 ]

3 голосов
/ 23 мая 2011
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
cal.add(Calendar.DAY_OF_MONTH, daysSinceEpoch);
3 голосов
/ 03 февраля 2017

Используйте классы java.time в Java 8 и более поздних версиях.В одной строке:

LocalDate date = LocalDate.ofEpochDay(1000);

Вызов ofEpochDay(long epochDay) получает экземпляр LocalDate из числа дней эпохи.

3 голосов
/ 23 мая 2011

Должно работать следующее:

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, чтобы все было нормально.

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