Java- разница между 2 разными временами в 2 разных дня

Я хочу написать программу, которая показывает время, оставшееся с настоящего момента до определенного времени в будущем. поскольку я хочу использовать Joda-Time, я много искал и нашел несколько кодов (например, этот), но я не знаю, как это сделать 2 раза в 2 разных дня. Есть идеи?


person Soheil    schedule 12.03.2015    source источник
comment
Немного запутался, что вам нужно. Вы просто хотите разницу между настоящим и определенной датой в будущем? Если это так, это легко сделать с помощью Period. Сбит с толку 2 раза в 2 разных дня   -  person Jimmy    schedule 13.03.2015
comment
Можете ли вы опубликовать любой код, который у вас есть до сих пор? Это может помочь нам понять, что вы пытаетесь сделать.   -  person Jordan    schedule 13.03.2015
comment
Каковы ваши входы и ожидаемые результаты?   -  person MadProgrammer    schedule 13.03.2015
comment
@MadProgrammer Я хочу указать 2 даты (год, месяц, день, час, минута, секунда), и это дает мне продолжительность между ними (день, час, минута, секунда)   -  person Soheil    schedule 13.03.2015


Ответы (3)


Вы имеете в виду что-то вроде...

DateTime from = new DateTime(2014, DateTimeConstants.FEBRUARY, 15, 8, 51, 30, 100);
DateTime to = new DateTime(2016, DateTimeConstants.DECEMBER, 25, 17, 01, 51, 50);

Interval i = new Interval(from, to);
Period p = i.toPeriod(PeriodType.yearMonthDayTime());

System.out.println(p.getYears() + " years");
System.out.println(p.getMonths() + " months");
System.out.println(p.getDays() + " days");
System.out.println(p.getHours() + " hours");
System.out.println(p.getSeconds() + " seconds");
System.out.println(p.getMillis() + " millis");

Какие выходы

2 years
10 months
10 days
8 hours
20 seconds
950 millis

Сейчас с помощью...

DateTime from = new DateTime();
DateTime to = new DateTime(2015, 3, 21, 2, 15, 10);

вместо этого печатает...

0 years
0 months
7 days
15 hours
26 seconds
755 millis
person MadProgrammer    schedule 12.03.2015
comment
да. Это правильный способ сделать это, и я счастлив научиться. Спасибо. - person muasif80; 13.03.2015
comment
@MadProgrammer спасибо, но я получаю странный результат! LocalDateTime from = new LocalDateTime(); LocalDateTime to = new LocalDateTime(2015, 3,21, 2, 15, 10); дает мне 0дней. Зачем???!! - person Soheil; 13.03.2015
comment
Да, я тоже это заметил после запуска этой программы. Я считаю, что даже за ваш вклад он не должен давать 3 дня. @MadProgrammer - person muasif80; 13.03.2015
comment
@ muasif80 См. обновление - показывает, как часто я на самом деле делаю это: P - person MadProgrammer; 13.03.2015
comment
:) Так какие обновления? То, как вы сейчас получаете объект периода, - это обновление или изменение DateTime. Я собираюсь запустить это сейчас, хотя. - person muasif80; 13.03.2015
comment
Хорошо понял. Interval не работает с LocalDateTime. - person muasif80; 13.03.2015
comment
@ muasif80 Нет, ему нужен объект DateTime, который содержит информацию о часовом поясе. Возможно, это можно понять, но это заставило его работать - person MadProgrammer; 13.03.2015

package com.test;

import java.util.Calendar;

import org.joda.time.Duration;

public class Main {

public Main() {
}

public static void main(String[] args) {
    Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();

    calendar1.add(Calendar.DAY_OF_YEAR, 1);
    calendar1.add(Calendar.HOUR_OF_DAY, 2);
    calendar1.add(Calendar.MINUTE, 10);

    Duration duration = new Duration(calendar2.getTimeInMillis(), calendar1.getTimeInMillis());
    System.out.println(duration.getMillis());
    System.out.println(duration.getStandardDays());
    System.out.println(duration.getStandardMinutes());
    System.out.println(duration.getStandardHours());
    System.out.println(duration.getStandardSeconds());
}

}

Я думаю, это может быть полезно для вас.

Этот код даст точно такую ​​же продолжительность. Вам нужно установить календарь2 на фиксированную дату в будущем, чтобы получить желаемый результат.

Обновление 1

Вы можете сделать это, например, на фиксированную дату в будущем. Могут быть и другие лучшие способы добиться того же.

package com.test;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.joda.time.Duration;

public class Main {

public Main() {
}

public static void main(String[] args) throws ParseException {
    Calendar calendar1 = Calendar.getInstance();

    DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    Date date1 = calendar1.getTime();
    Date date2 = df.parse("2015/03/20 10:30:00");


    Duration duration = new Duration(date1.getTime(), date2.getTime());
    long millis = duration.getMillis();
    long days = duration.getStandardDays();
    long mins = duration.getStandardMinutes();
    long hrs = duration.getStandardHours();
    long secs = duration.getStandardSeconds();

    System.out.println(days + ":" + (hrs % 24) + ":" + (mins%60) + ":" + (secs%(mins)) + " remaining");
}

}
person muasif80    schedule 12.03.2015
comment
Это интересный способ использования Duration. Есть ли причина, по которой вы бы просто не использовали LocalDateTime вместо этого? - person MadProgrammer; 13.03.2015
comment
Я не знаю о LocalDateTime :) Я думаю, это специфично для jodatime. Не использовали JodaTime много. Будем рады учиться у вас. - person muasif80; 13.03.2015
comment
Вы имеете в виду как org.joda.time.LocalDateTime? - person MadProgrammer; 13.03.2015
comment
@muasif80 работает некорректно :( - person Soheil; 13.03.2015
comment
@Soheil Как это работает неправильно? Каков ваш вклад и ожидаемый результат? - person MadProgrammer; 13.03.2015
comment
Вы можете рассмотреть возможность использования Period вместо Duration - person MadProgrammer; 13.03.2015
comment
@Soheil Я отредактировал его и снова внес небольшие изменения. Возможно, это сработало для вас сейчас. Но org.joda.time.Period должен быть правильным способом добиться этого. Не знаю, почему он не дает правильные дни. - person muasif80; 13.03.2015
comment
спасибо, это работает. да, период кажется правильным... - person Soheil; 13.03.2015

Вы упомянули, что хотите использовать Joda-time, поэтому одно из других решений может быть для вас лучше.

Однако теперь этот же процесс можно довольно легко выполнить с помощью собственной библиотеки времени Java 8 следующим образом:

public class Main {

    public static void main() {
        Instant then = Instant.EPOCH;  //1970-01-01T00:00:00Z
        Instant now = Instant.now(); //The current "instant" in time

        Duration duration = Duration.between(then, now);

        //Outputs the days, hours, minutes, and seconds between the epoch start and now.
        System.out.println(duration.getDays());
        System.out.println(duration.getHours());
        System.out.println(duration.getMinutes());
        System.out.println(duration.getSeconds());

        //If you want to account for having already displayed days 
        //when showing your hours, and so on down the units, do this:
        System.out.println(duration.getDays());
        duration = duration.minusDays(duration.getDays());

        System.out.println(duration.getHours());
        duration = duration.minusHours(duration.getHours());

        System.out.println(duration.getMinutes());
        duration = duration.minusMinutes(duration.getMinutes());

        System.out.println(duration.getSeconds());
    }

}

Ознакомьтесь с полной документацией по пакету здесь: http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

person bertag    schedule 12.03.2015
comment
Удивительно, но в вопросе действительно говорится, что они хотят / должны использовать Joda-Time, и, учитывая тот факт, что им нужны дни, часы, минуты и секунды между двумя датами, это предполагает, что Period будет лучшим выбором - person MadProgrammer; 13.03.2015
comment
@MadProgrammer, я с тобой в этом. На самом деле я обдумывал, стоит ли мне отвечать, учитывая запрос времени Джоды, и в конечном итоге решил, что это не повредит и может быть полезно для обсуждения. В соответствии с вашим комментарием я обновил код, чтобы показать результат в днях, часах, минутах и ​​секундах. - person bertag; 13.03.2015