Получить количество дней, недель и месяцев, начиная с эпохи в Java - PullRequest
23 голосов
/ 28 мая 2011

Я пытаюсь получить количество дней, недель, месяцев с начала эпохи в Java.

Класс Java Calendar предлагает такие вещи, как calendar.get (GregorianCalendar.DAY_OF_YEAR) или Calendar.get (GregorianCalendar.WEEK_OF_YEAR), который является хорошим началом, но он не выполняет именно то, что мне нужно.

Есть ли элегантный способ сделать это на Java?

Ответы [ 7 ]

35 голосов
/ 28 мая 2011

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

MutableDateTime epoch = new MutableDateTime();
epoch.setDate(0); //Set to Epoch time
DateTime now = new DateTime();

Days days = Days.daysBetween(epoch, now);
Weeks weeks = Weeks.weeksBetween(epoch, now);
Months months = Months.monthsBetween(epoch, now);

System.out.println("Days Since Epoch: " + days.getDays());
System.out.println("Weeks Since Epoch: " + weeks.getWeeks());
System.out.println("Months Since Epoch: " + months.getMonths());

Когда я запускаю это, я получаю следующий вывод:

Days Since Epoch: 15122
Weeks Since Epoch: 2160
Months Since Epoch: 496
21 голосов
/ 26 февраля 2016

java.time

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

LocalDate now = LocalDate.now();
LocalDate epoch = LocalDate.ofEpochDay(0);

System.out.println("Days: " + ChronoUnit.DAYS.between(epoch, now));
System.out.println("Weeks: " + ChronoUnit.WEEKS.between(epoch, now));
System.out.println("Months: " + ChronoUnit.MONTHS.between(epoch, now));

Вывод

Days: 16857
Weeks: 2408
Months: 553
9 голосов
/ 27 сентября 2012
Long currentMilli = System.currentTimeMillis();
Long seconds = currentMilli / 1000;
Long minutes = seconds / 60;
Long hours = minutes / 60;
Long days = hours / 24;
System.out.println("Days since epoch : "  + days);

или

System.out.println("Days since epoch : "  + ((int) currentMilli / 86400000));
2 голосов
/ 14 ноября 2018

Я немного удивлен, что почти все ответы на самом деле вычисляют дни между epoch и now. С java.time.LocalDate это так же просто, как:

LocalDate.now().toEpochDay()
0 голосов
/ 28 мая 2011

Я бы не ожидал, что будет элегантный способ сделать это, так как это не очень распространенное требование. Я не могу не задаться вопросом, почему вы хотите это сделать ...

Но в любом случае, я бы сделал так, чтобы вычесть дату эпохи из Calendar, а затем получить нужные поля:

Calendar timeSinceEpoch = Calendar.getInstance();
timeSinceEpoch.add(Calendar.YEAR, -1970);

int yearsSinceEpoch = timeSinceEpoch.get(Calendar.YEAR);
int monthsSinceEpoch = timeSinceEpoch.get(Calendar.MONTH) + 12 * yearsSinceEpoch;
0 голосов
/ 28 мая 2011
Calendar now = Calendar.getInstance();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(0); // start at EPOCH

int days = 0
while (cal.getTimeInMillis() < now.getTimeInMillis()) {
  days += 1
  cal.add(Calendar.DAY_OF_MONTH, 1) // increment one day at a time
}
System.out.println("Days since EPOCH = " + days);
0 голосов
/ 28 мая 2011

Date.getTime() - Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу, представленное этим объектом Date.

Вы можете использовать это и узнать, сколько миллисекунд находится в интервалах, которые вам нужны для выполнения вычислений.

...