Как узнать количество дней между двумя датами в java или groovy? - PullRequest
11 голосов
/ 25 февраля 2011

У меня есть метод, который использует следующую логику для расчета разницы между днями.

long diff = milliseconds2 - milliseconds1;
long diffDays = diff / (24 * 60 * 60 * 1000);

но я хочу, например, 9th feb 2011 to 19th feb 2011 должен вернуть мне 11 дней, независимо от секунды или миллисекунды. Как мне этого добиться?

Ответы [ 9 ]

32 голосов
/ 25 февраля 2011

Для того нестабильного решения, о котором вы просили, вам следует подумать об этом:

use(groovy.time.TimeCategory) {
   def duration = date1 - date2
   println "days: ${duration.days}, Hours: ${duration.hours}"
}

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

class Example {

    public static void main(String[] args) {
        def lastWeek = new Date() - 7;
        def today = new Date()

        println daysBetween(lastWeek, today)
    }

    static def daysBetween(def startDate, def endDate) {
        use(groovy.time.TimeCategory) {
            def duration = endDate - startDate
            return duration.days
        }
    }
}

Если вы запустите этот пример, он напечатает вас 7. Вы также можете улучшить этот метод, используя before() и after() для включения инвертированных дат.

12 голосов
/ 25 февраля 2011

Это изношенная линия, но для дат используйте JodaTime .

Вот как вычислить интервалы дат с использованием JodaTime.

Days days = Days.daysBetween(new DateTime(millis1), new DateTime(millis2));
int daysBetweenDates = days.getDays();
2 голосов
/ 25 февраля 2011
  GregorianCalendar cal1 = new GregorianCalendar(2011,2,9); 
  GregorianCalendar cal2 = new GregorianCalendar(2011,2,19); 
  long ms1 = cal1.getTime().getTime(); 
  long ms2 = cal2.getTime().getTime(); 
  long difMs = ms2-ms1; 
  long msPerDay = 1000*60*60*24; 

  double days = difMs / msPerDay;
0 голосов
/ 13 декабря 2017

Узнайте количество дней между двумя указанными датами:

@Test

public class Demo3 {

    public static void main(String[] args) {
        String dateStr ="2008-1-1 1:21:28";
        String dateStr2 = "2010-1-2 1:21:28";
        SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
        SimpleDateFormat format2 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
        try {
            Date date2 = format.parse(dateStr2);
            Date date = format.parse(dateStr);

            System.out.println("distance is :"+differentDaysByMillisecond(date,date2));
        }catch(ParseException e ){
            e.printStackTrace();
        }
    }

//get Days method

    private static int differentDaysByMillisecond(Date date, Date date2) {
        return (int)((date2.getTime()-date.getTime())/1000/60/60/24);
    }

}
0 голосов
/ 06 февраля 2017

В groovy все, что вам нужно, это:

date2 - date1

, который возвращает целое число, представляющее количество дней между двумя датами.

Или если вам необходимо защититься от изменения порядка между двумя экземплярами Date (операция возвращает отрицательные числа, когда первый операнд предшествует второму):

Math.abs(date2 - date1)

Приведенные выше примерыиспользуйте реализацию оператора groovy date.minus (date) , которая возвращает количество дней между двумя датами.

Пример сеанса groovy shell:

$ groovysh
Groovy Shell (2.4.8, JVM: 1.8.0_111)
Type ':help' or ':h' for help.

groovy:000> x = new Date(1486382537168)
===> Mon Feb 06 13:02:17 CET 2017

groovy:000> y = new Date(1486000000000)
===> Thu Feb 02 02:46:40 CET 2017

groovy:000> x - y
===> 4

или, если вам нужен метод:

int daysBetween(date1, date2) {
    Math.abs(date2 - date1)
}
0 голосов
/ 04 ноября 2015
Date.metaClass.calculateDays = { Date offset = new Date() ->            
    Long result = null
    Date date = delegate
    use(groovy.time.TimeCategory) {
        result = (offset - date).days as Long
    }            
    result            
}

пример использования:

def sdf = new java.text.SimpleDateFormat("yyyy.MM.dd")

sdf.lenient = false

Date date = sdf.parse("2015.10.02")

println date.calculateDays() 

println date.calculateDays(sdf.parse("2015.11.02"))
0 голосов
/ 25 февраля 2011

Попробуйте это:

DateFormat format = DateFormat.getDateTimeInstance();
    Date completeDate=null;
    Date postedDate=null;

    try
    {
        completeDate = format.parse("18-May-09 11:30:57");
        postedDate = format.parse("11-May-09 10:46:37");
        long res = completeDate.getTime() - postedDate.getTime();

        System.out.println("postedDate: " + postedDate);
        System.out.println("completeDate: " + completeDate);
        System.out.println("result: " + res + '\n' + "minutes: " + (double) res /  (60*1000) + '\n' 
            + "hours: " + (double) res /  (60*60*1000) + '\n' + "days: " + (double) res /  (24*60*60*1000));
    }
    catch (ParseException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Если вы хотите, чтобы дни были целыми числами, просто удалите приведение к удвоению.НТН

0 голосов
/ 25 февраля 2011

Предполагается, что время указано в UTC или GMT.

long day1 = milliseconds1/ (24 * 60 * 60 * 1000);
long day2 = milliseconds2/ (24 * 60 * 60 * 1000);
// the difference plus one to be inclusive of all days
long intervalDays = day2 - day1 + 1; 
0 голосов
/ 25 февраля 2011

просто разобрать 9th feb 2011 & 19th feb 2011 в даты, используя SimpleDateFormat и преобразовать его в начало и конец миллис, и применить ваш расчет

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