Я хочу вычесть два временных периода, например, 16:00:00 из 19:00:00. Есть ли для этого какая-нибудь java-функция? Результаты могут быть в миллисекундах, секундах или минутах.
а как насчет другого пути? 16:00 - 19:00? Как я могу это рассчитать?
Alex Kapustian
Инвертирование переменных не принесет особой пользы .. В этом примере, конечно, вы можете инвертировать их и взять абсолютное значение или что-то в этом роде. Но что будет, если у вас полночь (00:00)?
rj2700
1
А как насчет 23:15:00 - 01:15:00?
Александр
как насчет разницы между 08:00:00 сегодня и 10:00:00 вчера ??????? Я не думаю, что то, что вы предложили, является несостоятельной логикой.
channae
113
У Java 8 есть более чистое решение - Instant and Duration
Мне очень понравился твой ответ. Очень элегантно! :)
Авинаш
Таким образом, это сводится к двум импортам и System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));регистрации продолжительности. Я бы не назвал это красивым и чистым решением для Java8, если бы другие языки могли делать это с помощью кода вроде print("Duration: " + str(time.time()-start))...
Люк
4
@Luc Чистота - это не то же самое, что лаконичность. Намного яснее, что именно происходит в версии Java 8, и также гораздо проще настроить, если, например, вы хотите сообщить продолжительность между двумя моментами в единице, отличной от миллисекунд, или в нескольких единицах (например, 1h 15m 3.022sвместо 4503022 milliseconds) .
JakeRobb
41
Чтобы получить значительную разницу во времени, тогда
Это также доступно для Java SE 6 и 7 в качестве заднего порта , а также для Android .
Брайан
11
Как и любой другой язык; преобразуйте ваши периоды времени в метку времени unix (то есть секунды с эпохи Unix), а затем просто вычтите. Затем полученные секунды следует использовать как новую временную метку unix и читать в любом формате.
Ах, отдайте должное вышеуказанному постеру (genesiss), код всегда под рукой;) Хотя теперь у вас тоже есть объяснение :)
import java.util.Date;
...
Date d1 = new Date();
...
...
Date d2 = new Date();
System.out.println(d2.getTime()-d1.getTime()); //gives the time difference in milliseconds.
System.out.println((d2.getTime()-d1.getTime())/1000); //gives the time difference in seconds.
и, чтобы показать в более удобном формате, вы можете использовать:
DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));
Это дублирует другой ответ и не добавляет нового содержания. Пожалуйста, не публикуйте ответ, если у вас нет чего-то нового.
DavidPostill
@DavidPostill, спасибо за внимание. Но решение, в котором я нуждался сам и не нашел в сообщении GENESIS, заключалось в разнице во времени между выполнением двух строк кода (например, начальной и конечной точкой программы или до и после запуска метода, а не некоторых статических времен) . Я думал, это может помочь.
Алиса
3
Помимо наиболее распространенного подхода с объектами Period и Duration, вы можете расширить свои знания другим способом работы со временем в Java.
Расширенные библиотеки Java 8.
ChronoUnit для различий.
ChronoUnit - отличный способ определить, насколько далеко друг от друга находятся два значения Temporal. Temporal включает LocalDate , LocalTime и так далее.
LocalTime one = LocalTime.of(5,15);
LocalTime two = LocalTime.of(6,30);
LocalDate date = LocalDate.of(2019, 1, 29);
System.out.println(ChronoUnit.HOURS.between(one, two)); //1
System.out.println(ChronoUnit.MINUTES.between(one, two)); //75
System.out.println(ChronoUnit.MINUTES.between(one, date)); //DateTimeException
Первый пример показывает, что между усечениями, а не раундами.
Второй показывает, насколько легко считать разные единицы.
И последний пример напоминает нам, что не стоит путаться с датой и временем в Java :)
Я никогда не упоминал временные метки unix. Также хорошо известно, что Java Date and Time API отстой для более чем случайного использования. JodaTime намного лучше и, вероятно, будет подходящим вариантом, пока JSR 310 не станет частью Java. sourceforge.net/apps/mediawiki/threeten/…
Манфред Мозер,
@Manfred Moser: может быть, вам стоит ... И классы времени Java по умолчанию, и Joda дают время в миллисекундах, которое начинается с того, что называется эпохой Unix . На этом этапе они становятся чертовски близкими к отметкам времени Unix (одна в миллисекундах, другая - в секундах). В любом случае, то, что хочет OP, можно сделать тривиально, используя классы Java по умолчанию, взяв количество миллисекунд с эпохи Unix и вычтя их.
SyntaxT3rr0r
1
Конечно, это можно сделать банально. И если вы выполняете много вычислений даты и времени в своем приложении, вы также можете тривиально создать множество ошибок и заново изобрести свою собственную небольшую библиотеку, реализующую части JodaTime самостоятельно. Для одного простого расчета это может быть нормально, но для частого использования стоит использовать приличную библиотеку. Я просто пытаюсь указать на то, что первое простое решение может не привести вас на лучший путь. Что случилось с этим?
Манфред Мозер
3
@Manfred Moser: На самом деле, первое простое решение - это правильный путь, учитывая, что OP запрашивал разницу между двумя периодами времени, а не изменения в атомных часах :)
Christian
Конечно .. только для этого примера и конкретного вопроса. Но не для общей картины.
Манфред Мозер
2
String start = "12:00:00";
String end = "02:05:00";
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
Date date1 = format.parse(start);
Date date2 = format.parse(end);
long difference = date2.getTime() - date1.getTime();
int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(difference);
if(minutes<0)minutes += 1440;
Теперь минуты будут правильной продолжительностью между двумя часами (в минутах).
Date start = new Date();
//Waiting for 10 seconds
Thread.sleep(10000);
Date end = new Date();
long diff = end.getTime() - start.getTime();
String TimeTaken = String.format("[%s] hours : [%s] mins : [%s] secs",
Long.toString(TimeUnit.MILLISECONDS.toHours(diff)),
TimeUnit.MILLISECONDS.toMinutes(diff),
TimeUnit.MILLISECONDS.toSeconds(diff));
System.out.println(String.format("Time taken %s", TimeTaken));
Вывод : Затраченное время [0] часов: [0] минут: [10] секунд
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность.
Бенджамин В.
0
class TimeCalculator {String updateTime;
publicTimeCalculator(String time){
// time should be in 24 hours format like 15/06/2016 17:39:20 this.updateTime = time;
}
public String getTimeDifference(){
String td=null;
// get Current Time
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Date currentDate = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(currentDate);
int c_year = calendar.get(Calendar.YEAR);
int c_month = calendar.get(Calendar.MONTH) + 1;
int c_day = calendar.get(Calendar.DAY_OF_MONTH);
// get Editing Time
Date edit_date = sdf.parse(updateTime);
Calendar edit_calendar = new GregorianCalendar();
edit_calendar.setTime(edit_date);
int e_year = edit_calendar.get(Calendar.YEAR);
int e_month = edit_calendar.get(Calendar.MONTH) + 1;
int e_day = edit_calendar.get(Calendar.DAY_OF_MONTH);
if(e_year==c_year&&e_month==c_month&&e_day==c_day)
{
int c_hours = calendar.get(Calendar.HOUR_OF_DAY);
int c_minutes = calendar.get(Calendar.MINUTE);
int c_seconds = calendar.get(Calendar.SECOND);
int e_hours = edit_calendar.get(Calendar.HOUR_OF_DAY);
int e_minutes = edit_calendar.get(Calendar.MINUTE);
int e_seconds = edit_calendar.get(Calendar.SECOND);
if(c_hours==e_hours&&c_minutes==e_minutes&&c_seconds==e_seconds)
{
td = "just now";
return td;
}
elseif(c_hours==e_hours&&c_minutes==e_minutes)
{
int d_seconds = c_seconds-e_seconds;
td = String.valueOf(d_seconds);
td = td+" seconds ago";
return td;
}
elseif(c_hours==e_hours&&c_minutes!=e_minutes)
{
int d_minutes = c_minutes-e_minutes;
int d_seconds;
if(c_seconds>e_seconds)
{
d_seconds = c_seconds-e_seconds;
}else{
d_seconds = e_seconds-c_seconds;
}
td = "00:"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago";
return td;
}
else
{
int d_minutes,d_seconds,d_hours;
d_hours=c_hours-e_hours;
if(c_minutes>e_minutes)
{
d_minutes = c_minutes-e_minutes;
}else{
d_minutes = e_minutes-c_minutes;
}
if(c_seconds>e_seconds)
{
d_seconds = c_seconds-e_seconds;
}else{
d_seconds = e_seconds-c_seconds;
}
td = String.valueOf(d_hours)+":"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago";
return td;
}
}
elseif(e_year==c_year&&e_month==c_month&&c_day==e_day+1){
td = "yesterday";
return td;
}
else{
td = updateTime;
return td;
}
}}
Ответы:
String time1 = "16:00:00"; String time2 = "19:00:00"; SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); Date date1 = format.parse(time1); Date date2 = format.parse(time2); long difference = date2.getTime() - date1.getTime();
Разница в миллисекундах.
Я модифицировал пост sfaizs .
источник
У Java 8 есть более чистое решение - Instant and Duration
Пример:
import java.time.Duration; import java.time.Instant; ... Instant start = Instant.now(); //your code Instant end = Instant.now(); Duration timeElapsed = Duration.between(start, end); System.out.println("Time taken: "+ timeElapsed.toMillis() +" milliseconds");
источник
System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));
регистрации продолжительности. Я бы не назвал это красивым и чистым решением для Java8, если бы другие языки могли делать это с помощью кода вродеprint("Duration: " + str(time.time()-start))
...1h 15m 3.022s
вместо4503022 milliseconds
) .Чтобы получить значительную разницу во времени, тогда
// d1, d2 are dates long diff = d2.getTime() - d1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000) % 24; long diffDays = diff / (24 * 60 * 60 * 1000); System.out.print(diffDays + " days, "); System.out.print(diffHours + " hours, "); System.out.print(diffMinutes + " minutes, "); System.out.print(diffSeconds + " seconds.");
источник
Java 8
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime1= LocalDateTime.parse("2014-11-25 19:00:00", formatter); LocalDateTime dateTime2= LocalDateTime.parse("2014-11-25 16:00:00", formatter); long diffInMilli = java.time.Duration.between(dateTime1, dateTime2).toMillis(); long diffInSeconds = java.time.Duration.between(dateTime1, dateTime2).getSeconds(); long diffInMinutes = java.time.Duration.between(dateTime1, dateTime2).toMinutes();
источник
Как и любой другой язык; преобразуйте ваши периоды времени в метку времени unix (то есть секунды с эпохи Unix), а затем просто вычтите. Затем полученные секунды следует использовать как новую временную метку unix и читать в любом формате.
Ах, отдайте должное вышеуказанному постеру (genesiss), код всегда под рукой;) Хотя теперь у вас тоже есть объяснение :)
источник
import java.util.Date; ... Date d1 = new Date(); ... ... Date d2 = new Date(); System.out.println(d2.getTime()-d1.getTime()); //gives the time difference in milliseconds. System.out.println((d2.getTime()-d1.getTime())/1000); //gives the time difference in seconds.
и, чтобы показать в более удобном формате, вы можете использовать:
DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###"); System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));
источник
Помимо наиболее распространенного подхода с объектами Period и Duration, вы можете расширить свои знания другим способом работы со временем в Java.
Расширенные библиотеки Java 8. ChronoUnit для различий.
ChronoUnit - отличный способ определить, насколько далеко друг от друга находятся два значения Temporal. Temporal включает LocalDate , LocalTime и так далее.
LocalTime one = LocalTime.of(5,15); LocalTime two = LocalTime.of(6,30); LocalDate date = LocalDate.of(2019, 1, 29); System.out.println(ChronoUnit.HOURS.between(one, two)); //1 System.out.println(ChronoUnit.MINUTES.between(one, two)); //75 System.out.println(ChronoUnit.MINUTES.between(one, date)); //DateTimeException
Первый пример показывает, что между усечениями, а не раундами.
Второй показывает, насколько легко считать разные единицы.
И последний пример напоминает нам, что не стоит путаться с датой и временем в Java :)
источник
Болезненный способ - преобразовать в миллис и выполнить вычитание, а затем вернуться к тем секундам, которые вам нужны. Лучше использовать JodaTime .
источник
String start = "12:00:00"; String end = "02:05:00"; SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); Date date1 = format.parse(start); Date date2 = format.parse(end); long difference = date2.getTime() - date1.getTime(); int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(difference); if(minutes<0)minutes += 1440;
Теперь минуты будут правильной продолжительностью между двумя часами (в минутах).
источник
import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws Exception{ String time1 = "12:00:00"; String time2 = "12:01:00"; SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); Date date1 = format.parse(time1); Date date2 = format.parse(time2); long difference = date2.getTime() - date1.getTime(); System.out.println(difference/1000); }}
выдает исключение обрабатывает исключения синтаксического анализа
источник
Альтернативный вариант, если берется время из разных дней, например: 22:00 и 01:55.
public static long getDiffTime(Date date1, Date date2){ if (date2.getTime() - date1.getTime() < 0) {// if for example date1 = 22:00, date2 = 01:55. Calendar c = Calendar.getInstance(); c.setTime(date2); c.add(Calendar.DATE, 1); date2 = c.getTime(); } //else for example date1 = 01:55, date2 = 03:55. long ms = date2.getTime() - date1.getTime(); //235 minutes ~ 4 hours for (22:00 -- 01:55). //120 minutes ~ 2 hours for (01:55 -- 03:55). return TimeUnit.MINUTES.convert(ms, TimeUnit.MILLISECONDS); }
источник
public class timeDifference { public static void main(String[] args) { try { Date startTime = Calendar.getInstance().getTime(); Thread.sleep(10000); Date endTime = Calendar.getInstance().getTime(); long difference = endTime.getTime() - startTime.getTime(); long differenceSeconds = difference / 1000 % 60; long differenceMinutes = difference / (60 * 1000) % 60; long differenceHours = difference / (60 * 60 * 1000) % 24; long differenceDays = difference / (24 * 60 * 60 * 1000); System.out.println(differenceDays + " days, "); System.out.println(differenceHours + " hours, "); System.out.println(differenceMinutes + " minutes, "); System.out.println(differenceSeconds + " seconds."); } catch (Exception e) { e.printStackTrace(); } }
}
источник
Попробуй это:
public String timeDifference8(String startTime, String endTime) { LocalTime initialTime = LocalTime.parse(startTime); LocalTime finalTime =LocalTime.parse(endTime); StringJoiner joiner = new StringJoiner(":"); long hours = initialTime.until( finalTime, ChronoUnit.HOURS); initialTime = initialTime.plusHours( hours ); long minutes = initialTime.until(finalTime, ChronoUnit.MINUTES); initialTime = initialTime.plusMinutes( minutes ); long seconds = initialTime.until( finalTime, ChronoUnit.SECONDS); joiner.add(String.valueOf(hours)); joiner.add(String.valueOf(minutes)); joiner.add(String.valueOf(seconds)); return joiner.toString(); }
источник
import java.sql.*; class Time3 { public static void main(String args[]){ String time1 = "01:03:23"; String time2 = "02:32:00"; long difference ; Time t1 = Time.valueOf(time1); Time t2 = Time.valueOf(time2); if(t2.getTime() >= t1.getTime()){ difference = t2.getTime() - t1.getTime() -19800000; } else{ difference = t1.getTime() - t2.getTime() -19800000; } java.sql.Time time = new java.sql.Time(difference); System.out.println(time); } }
источник
Я нашел это более чистым.
Date start = new Date(); //Waiting for 10 seconds Thread.sleep(10000); Date end = new Date(); long diff = end.getTime() - start.getTime(); String TimeTaken = String.format("[%s] hours : [%s] mins : [%s] secs", Long.toString(TimeUnit.MILLISECONDS.toHours(diff)), TimeUnit.MILLISECONDS.toMinutes(diff), TimeUnit.MILLISECONDS.toSeconds(diff)); System.out.println(String.format("Time taken %s", TimeTaken));
источник
/* * Total time calculation. */ private void getTotalHours() { try { // TODO Auto-generated method stub if (tfTimeIn.getValue() != null && tfTimeOut.getValue() != null) { Long min1 = tfTimeOut.getMinutesValue(); Long min2 = tfTimeIn.getMinutesValue(); Long hr1 = tfTimeOut.getHoursValue(); Long hr2 = tfTimeIn.getHoursValue(); Long hrsTotal = new Long("0"); Long minTotal = new Long("0"); if ((hr2 - hr1) == 1) { hrsTotal = (long) 1; if (min1 != 0 && min2 == 0) { minTotal = (long) 60 - min1; } else if (min1 == 0 && min2 != 0) { minTotal = min2; } else if (min1 != 0 && min2 != 0) { minTotal = min2; Long minOne = (long) 60 - min1; Long minTwo = min2; minTotal = minOne + minTwo; } if (minTotal >= 60) { hrsTotal++; minTotal = minTotal % 60; } } else if ((hr2 - hr1) > 0) { hrsTotal = (hr2 - hr1); if (min1 != 0 && min2 == 0) { minTotal = (long) 60 - min1; } else if (min1 == 0 && min2 != 0) { minTotal = min2; } else if (min1 != 0 && min2 != 0) { minTotal = min2; Long minOne = (long) 60 - min1; Long minTwo = min2; minTotal = minOne + minTwo; } if (minTotal >= 60) { minTotal = minTotal % 60; } } else if ((hr2 - hr1) == 0) { if (min1 != 0 || min2 != 0) { if (min2 > min1) { hrsTotal = (long) 0; minTotal = min2 - min1; } else { Notification.show("Enter A Valid Time"); tfTotalTime.setValue("00.00"); } } } else { Notification.show("Enter A Valid Time"); tfTotalTime.setValue("00.00"); } String hrsTotalString = hrsTotal.toString(); String minTotalString = minTotal.toString(); if (hrsTotalString.trim().length() == 1) { hrsTotalString = "0" + hrsTotalString; } if (minTotalString.trim().length() == 1) { minTotalString = "0" + minTotalString; } tfTotalTime.setValue(hrsTotalString + ":" + minTotalString); } else { tfTotalTime.setValue("00.00"); } } catch (Exception e) { e.printStackTrace(); } }
источник
class TimeCalculator {String updateTime;
public TimeCalculator(String time) { // time should be in 24 hours format like 15/06/2016 17:39:20 this.updateTime = time; } public String getTimeDifference() { String td=null; // get Current Time SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); Date currentDate = new Date(); Calendar calendar = new GregorianCalendar(); calendar.setTime(currentDate); int c_year = calendar.get(Calendar.YEAR); int c_month = calendar.get(Calendar.MONTH) + 1; int c_day = calendar.get(Calendar.DAY_OF_MONTH); // get Editing Time Date edit_date = sdf.parse(updateTime); Calendar edit_calendar = new GregorianCalendar(); edit_calendar.setTime(edit_date); int e_year = edit_calendar.get(Calendar.YEAR); int e_month = edit_calendar.get(Calendar.MONTH) + 1; int e_day = edit_calendar.get(Calendar.DAY_OF_MONTH); if(e_year==c_year&&e_month==c_month&&e_day==c_day) { int c_hours = calendar.get(Calendar.HOUR_OF_DAY); int c_minutes = calendar.get(Calendar.MINUTE); int c_seconds = calendar.get(Calendar.SECOND); int e_hours = edit_calendar.get(Calendar.HOUR_OF_DAY); int e_minutes = edit_calendar.get(Calendar.MINUTE); int e_seconds = edit_calendar.get(Calendar.SECOND); if(c_hours==e_hours&&c_minutes==e_minutes&&c_seconds==e_seconds) { td = "just now"; return td; } else if(c_hours==e_hours&&c_minutes==e_minutes) { int d_seconds = c_seconds-e_seconds; td = String.valueOf(d_seconds); td = td+" seconds ago"; return td; } else if(c_hours==e_hours&&c_minutes!=e_minutes) { int d_minutes = c_minutes-e_minutes; int d_seconds; if(c_seconds>e_seconds) { d_seconds = c_seconds-e_seconds; }else{ d_seconds = e_seconds-c_seconds; } td = "00:"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago"; return td; } else { int d_minutes,d_seconds,d_hours; d_hours=c_hours-e_hours; if(c_minutes>e_minutes) { d_minutes = c_minutes-e_minutes; }else{ d_minutes = e_minutes-c_minutes; } if(c_seconds>e_seconds) { d_seconds = c_seconds-e_seconds; }else{ d_seconds = e_seconds-c_seconds; } td = String.valueOf(d_hours)+":"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago"; return td; } } else if(e_year==c_year&&e_month==c_month&&c_day==e_day+1){ td = "yesterday"; return td; } else{ td = updateTime; return td; } }}
источник