2014-11-18 4 views
108

Я знаю, что есть много вопросов о том, как получить, но я хочу и пример, используя новую Java 8 Date api. Я также знаю библиотеку JodaTime, но я хочу работать без внешних библиотек.Вычислить дни между двумя датами в Java 8

Функция должна сетовать с этими ограничениями:

  1. Предотвращение ошибок от даты SAVETIME
  2. Входные два объекта Дата (без времени, я знаю LocalDateTime, но мне нужно делать с датой экземпляров)
+2

Что-то вроде [это, например] (http://stackoverflow.com/questions/25776787/java-simpledateformat-format-issue-with-yyyy/25777559#25777559)? – MadProgrammer

+0

@MadProgrammer Не совсем - Продолжительность не подходит для этого ... – assylias

+0

@assylias Ну, это лучше, чем у OP было – MadProgrammer

ответ

176

Если вы хотите логических календарных дней, используйте метод DAYS.between() из java.time.temporal.ChronoUnit:

LocalDate dateBefore; 
LocalDate dateAfter; 
long daysBetween = DAYS.between(dateBefore, dateAfter); 

Если вы хотите буквальные 24 часа днейдлительность), вы можете использовать Duration класс вместо:

LocalDate today = LocalDate.now() 
LocalDate yesterday = today.minusDays(1); 
// Duration oneDay = Duration.between(today, yesterday); // throws an exception 
Duration.between(today.atStartOfDay(), yesterday.atStartOfDay()).toDays() // another option 

Для получения дополнительной информации обратитесь к this document (и другие документы повторно: Java 8 от Oracle).

+7

Это генерирует исключение, потому что [для метода Duration.between требуются временные объекты, способные поддерживать блок SECONDS] (https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html# между-java.time.temporal.Temporal-java.time.temporal.Temporal-). Вместо этого попробуйте 'Duration.between (today.atTime (0, 0), вчера.atTime (0, 0)). ToDays()'. – VGR

+2

-1 Продолжительность не подходит для этого. – assylias

+2

Вместо 'today.atTime (0, 0)' вы можете делать 'today.atStartOfDay()'. – eee

65

На основе замечаний Vgr здесь является то, что вы можете использовать:

ChronoUnit.DAYS.between(firstDate, secondDate) 
7

Вы можете использовать DAYS.between из java.time.temporal.ChronoUnit

например

import java.time.temporal.ChronoUnit; 

public long getDaysCountBetweenDates(LocalDate dateBefore, LocalDate dateAfter) { 
    return DAYS.between(dateBefore, dateAfter); 
} 
14

Вы можете использовать until():

LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); 
LocalDate christmas = LocalDate.of(2014, Month.DECEMBER, 25); 

System.out.println("Until christmas: " + independenceDay.until(christmas)); 
System.out.println("Until christmas (with crono): " + independenceDay.until(christmas, ChronoUnit.DAYS)); 
+1

Второй оператор System.out.println - это то, что я искал. Благодаря! – Sedrick

2

Использование дней в перечислении java.time.temporal.ChronoUnit. Ниже приведен пример кода:

Выход: * Количество дней между датой начала: 2015-03-01 и дата окончания: 2016-03-03 в ==> 368. ** Количество дней между датой начала: 2016-03-03 и дата окончания: 2015-03-01 это ==> -368 *

package com.bitiknow.date; 

import java.time.LocalDate; 
import java.time.temporal.ChronoUnit; 

/** 
* 
* @author pradeep 
* 
*/ 
public class LocalDateTimeTry { 
    public static void main(String[] args) { 

     // Date in String format. 
     String dateString = "2015-03-01"; 

     // Converting date to Java8 Local date 
     LocalDate startDate = LocalDate.parse(dateString); 
     LocalDate endtDate = LocalDate.now(); 
     // Range = End date - Start date 
     Long range = ChronoUnit.DAYS.between(startDate, endtDate); 
     System.out.println("Number of days between the start date : " + dateString + " and end date : " + endtDate 
       + " is ==> " + range); 

     range = ChronoUnit.DAYS.between(endtDate, startDate); 
     System.out.println("Number of days between the start date : " + endtDate + " and end date : " + dateString 
       + " is ==> " + range); 

    } 

} 
3

Здесь вы идете:

public class DemoDate { 
    public static void main(String[] args) { 
     LocalDate today = LocalDate.now(); 
     System.out.println("Current date: " + today); 

     //add 1 month to the current date 
     LocalDate date2 = today.plus(1, ChronoUnit.MONTHS); 
     System.out.println("Next month: " + date2); 

     // Put latest date 1st and old date 2nd in 'between' method to get -ve date difference 
     long daysNegative = ChronoUnit.DAYS.between(date2, today); 
     System.out.println("Days : "+daysNegative); 

     // Put old date 1st and new date 2nd in 'between' method to get +ve date difference 
     long datePositive = ChronoUnit.DAYS.between(today, date2); 
     System.out.println("Days : "+datePositive); 
    } 
} 
0

Получить количество дней до Рождества с текущего дня, попробуйте это

System.out.println(ChronoUnit.DAYS.between(LocalDate.now(),LocalDate.of(Year.now().getValue(), Month.DECEMBER, 25))); 
0

Все говорят, что используют ChronoUnit.DAYS.between, но это просто делегирует другой метод, который вы могли бы назвать самим собой. Таким образом, вы также можете сделать firstDate.until(secondDate, ChronoUnit.DAYS).

Документы для обоих фактически упоминают оба подхода и говорят, чтобы использовать то, что более читаемо.

+0

FWIW ... Я не уверен, почему оба существуют. Есть ли времена, когда один из них более читабельный, а другой - другой? Когда/почему? – nafg

 Смежные вопросы

  • Нет связанных вопросов^_^