Chcę odjąć dwa okresy czasu, powiedzmy 16:00:00 od 19:00:00. Czy jest do tego funkcja Java? Wyniki mogą być podawane w milisekundach, sekundach lub minutach.
a co w drugą stronę? 16:00 - 19:00? Jak mogę to obliczyć?
Alex Kapustian
Odwracanie zmiennych nie da wiele dobrego. W tym przykładzie z pewnością można je odwrócić i przyjąć wartość bezwzględną lub coś w tym rodzaju. Ale co się stanie, jeśli masz północ (00:00)?
rj2700,
1
A co z 23:15:00 - 01:15:00?
Oleksandr
a co z różnicą między dzisiejszą 08:00 a wczorajszą 10:00 ??????? Nie sądzę, żeby to, co zasugerowałeś, jest logiką, którą można złamać.
Naprawdę podobała mi się twoja odpowiedź. Bardzo eleganckie! :)
Avinash
A więc sprowadza się to do dwóch importów i System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));zarejestrowania czasu trwania. Nie nazwałbym tego ładnym i czystym rozwiązaniem w Javie8, gdyby inne języki potrafiły to zrobić za pomocą kodu takiego jak print("Duration: " + str(time.time()-start))...
Luc
4
Czystość @Luc to nie to samo, co zwięzłość. Jest o wiele bardziej jasne, co dokładnie dzieje się w wersji Java 8, a także znacznie łatwiej jest dostosować, jeśli na przykład chcesz raportować czas trwania między dwoma momentami w jednostce innej niż milisekundy lub jako wiele jednostek (np. 1h 15m 3.022sZamiast 4503022 milliseconds) .
Jest to również dostępne dla Java SE 6 i 7 jako port tylny , a także dla Androida .
Bryan
11
Jak każdy inny język; przekonwertuj swoje okresy na uniksowy znacznik czasu (tj. sekundy od epoki Uniksa), a następnie po prostu odejmij. Następnie wynikowe sekundy powinny zostać użyte jako nowy znacznik czasu unixa i odczytane w dowolnym formacie.
Ach, daj powyższemu plakatowi (genesiss) jego należne uznanie, kod jest zawsze pod ręką;) Chociaż teraz masz też wyjaśnienie :)
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.
a żeby pokazać w ładniejszym formacie, możesz użyć:
DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));
To powiela inną odpowiedź i nie dodaje żadnej nowej treści. Nie publikuj odpowiedzi, chyba że masz coś nowego do dodania.
DavidPostill
@DavidPostill, dziękuję za uwagę. Ale rozwiązaniem, którego sam potrzebowałem i nie znalazłem w poście GENESIS, była różnica czasu między wykonaniem dwóch linii kodu (jak punkt początkowy i końcowy programu lub przed i po uruchomieniu metody, a nie jakieś statyczne czasy) . Pomyślałem, że to może pomóc.
Alisa
3
Oprócz najpopularniejszego podejścia do obiektów Okres i Czas trwania, możesz poszerzyć swoją wiedzę o inny sposób radzenia sobie z czasem w Javie.
Zaawansowane biblioteki Java 8.
ChronoUnit for Differences.
ChronoUnit to świetny sposób na określenie, jak daleko od siebie znajdują się dwie wartości czasowe. Temporal obejmuje LOCALDATE , Localtime i tak dalej.
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
Pierwszy przykład pokazuje, że między obcięciami, a nie rundami.
Drugi pokazuje, jak łatwo jest policzyć różne jednostki.
A ostatni przykład przypomina nam, że nie powinniśmy mieszać z datami i godzinami w Javie :)
Nigdy nie wspomniałem o uniksowych znacznikach czasu. Powszechnie wiadomo również, że Java Date and Time API jest do dupy nie tylko do sporadycznego użycia. JodaTime jest znacznie lepszy i prawdopodobnie jest drogą, dopóki JSR 310 nie będzie częścią Javy. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser
@Manfred Moser: może powinieneś był ... Obie domyślne klasy czasu Javy i Joda podają czas w milisach, który zaczyna się od tak zwanej epoki Uniksa . W tym momencie stają się bardzo zbliżone do znaczników czasu Uniksa (jeden jest w milisach, drugi w sekundach). W każdym razie to, czego chce OP, można zrobić w trywialny sposób, używając domyślnych klas Javy, biorąc liczbę milisekund od epoki Uniksa i odejmując je.
SyntaxT3rr0r
1
Pewnie, że można to zrobić w trywialny sposób. A jeśli wykonujesz wiele obliczeń daty i czasu w swojej aplikacji, możesz również w prosty sposób samodzielnie stworzyć wiele błędów i ponownie wymyślić własną małą bibliotekę, wdrażając części JodaTime samodzielnie. Do jednego prostego obliczenia, które może być w porządku, ale do częstego stosowania warto skorzystać z porządnej biblioteki. Próbuję tylko wskazać, że pierwsze proste rozwiązanie może nie prowadzić Cię na najlepszą ścieżkę. Co z tym jest nie tak?
Manfred Moser,
3
@Manfred Moser: Właściwie pierwszym prostym rozwiązaniem jest właściwa ścieżka, biorąc pod uwagę, że OP poprosił o różnicę między dwoma okresami czasu, a nie o zmiany w zegarze atomowym :)
Christian
Jasne… tylko dla tego przykładu i konkretnego pytania. Jednak nie dla szerszego obrazu.
Manfred Moser,
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;
Teraz minuty będą prawidłowym czasem między dwoma czasami (w minutach).
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));
Wyjście : Zajęty czas [0] godzin: [0] min: [10] sek
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
Benjamin W.
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;
}
}}
Odpowiedzi:
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();
Różnica jest w milisekundach.
Zmodyfikowałem post sfaizs .
źródło
Java 8 ma bardziej przejrzyste rozwiązanie - Instant i Duration
Przykład:
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");
źródło
System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));
zarejestrowania czasu trwania. Nie nazwałbym tego ładnym i czystym rozwiązaniem w Javie8, gdyby inne języki potrafiły to zrobić za pomocą kodu takiego jakprint("Duration: " + str(time.time()-start))
...1h 15m 3.022s
Zamiast4503022 milliseconds
) .ABY uzyskać ładne różnice w czasie
// 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.");
źródło
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();
źródło
Jak każdy inny język; przekonwertuj swoje okresy na uniksowy znacznik czasu (tj. sekundy od epoki Uniksa), a następnie po prostu odejmij. Następnie wynikowe sekundy powinny zostać użyte jako nowy znacznik czasu unixa i odczytane w dowolnym formacie.
Ach, daj powyższemu plakatowi (genesiss) jego należne uznanie, kod jest zawsze pod ręką;) Chociaż teraz masz też wyjaśnienie :)
źródło
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.
a żeby pokazać w ładniejszym formacie, możesz użyć:
DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###"); System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));
źródło
Oprócz najpopularniejszego podejścia do obiektów Okres i Czas trwania, możesz poszerzyć swoją wiedzę o inny sposób radzenia sobie z czasem w Javie.
Zaawansowane biblioteki Java 8. ChronoUnit for Differences.
ChronoUnit to świetny sposób na określenie, jak daleko od siebie znajdują się dwie wartości czasowe. Temporal obejmuje LOCALDATE , Localtime i tak dalej.
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
Pierwszy przykład pokazuje, że między obcięciami, a nie rundami.
Drugi pokazuje, jak łatwo jest policzyć różne jednostki.
A ostatni przykład przypomina nam, że nie powinniśmy mieszać z datami i godzinami w Javie :)
źródło
Bolesnym sposobem jest konwersja na milis i odejmowanie, a następnie powrót do dowolnych sekund lub więcej. Lepszym sposobem jest użycie JodaTime .
źródło
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;
Teraz minuty będą prawidłowym czasem między dwoma czasami (w minutach).
źródło
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); }}
zgłasza wyjątek obsługuje wyjątki analizowania
źródło
Alternatywna opcja, jeśli brany jest czas z różnych dni, na przykład: 22:00 i 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); }
źródło
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(); } }
}
źródło
Spróbuj tego:
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(); }
źródło
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); } }
źródło
Uważam, że to jest bardziej czystsze.
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));
źródło
/* * 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(); } }
źródło
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; } }}
źródło