Czy jest jakiś sposób, aby to osiągnąć dzięki Javie 8 Duration?
IgorGanapolsky
3
Jeśli tmoże być <0(ujemne), to druga linia powinna być int minutes = Math.abs(t) % 60;.
wittich
1
a także jeśli chcesz z czasem am lub pm, dodaj ten warunek String amOrPm; if (timeInminutes> = 720) amOrPm = "PM"; else amOrPm = "AM"; String convertTime = godziny + ":" + minuty + amOrPm;
SFAH
Co zrobić z lokalizacjami innymi niż AM / PM? To jest tylko częściowe, niezlokalizowane rozwiązanie.
Klasy java.time zawierają parę klas reprezentujących okresy czasu. DurationKlasa jest na godziny-minuty-sekundy, a Periodto za years-miesięcy do dni.
Duration d = Duration.ofMinutes( 260L );
Duration Części
Uzyskaj dostęp do każdej części Duration, dzwoniąc to…Part. Te metody zostały dodane w Javie 9 i nowszych.
long days = d.toDaysPart() ;
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
int seconds = d.toSecondsPart() ;
int nanos = d.toNanosPart() ;
Następnie możesz złożyć własny ciąg z tych części.
ISO 8601
Standard ISO 8601 definiuje formaty tekstowe dla wartości daty i godziny. W przypadku okresów czasu niezwiązanych z osią czasu standardowym formatem jest PnYnMnDTnHnMnS. Te Pznaki początku i Toddziela rok-miesiąc-dzień od godziny-minuty-sekundy. Czyli półtorej godziny PT1H30M.
Klasy java.time używają domyślnie formatów ISO 8601 do analizowania i generowania ciągów. DurationI Periodzajęcia używać tego konkretnego formatu standardowego. Więc po prostu zadzwoń toString.
String output = d.toString();
PT4H20M
Aby uzyskać formatowanie alternatywne, utwórz własny ciąg w języku Java 9 i nowszych ( nie w języku Java 8) za pomocą Duration::to…Partmetod. Lub zobacz tę odpowiedź, aby użyć wyrażenia regularnego do manipulowania ciągiem w formacie ISO 8601.
LocalTime
Zdecydowanie sugeruję użycie standardowego formatu ISO 8601 zamiast niezwykle niejednoznacznego i mylącego formatu zegara 04:20. Ale jeśli nalegasz, możesz uzyskać ten efekt, hakując LocalTimeklasę. Działa to, jeśli czas trwania nie przekracza 24 godzin.
LocalTime hackUseOfClockAsDuration = LocalTime.MIN.plus( d );
String output = hackUseOfClockAsDuration.toString();
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .
Fajnie, szukam czegoś takiego, ale chciałbym otrzymać wynik jako „4h 20m” lub „4h 20min” zamiast „PT4H20M” lub „04:20”. Myślę, że będę musiał użyć jakiejś metody formatowania?
aditsu zrezygnowało, ponieważ SE jest ZŁEM
@aditsuquitbecause SEisEVIL Java 9 przyniosła Duration::to…Partmetody pokazane przez moje zmiany do tej odpowiedzi. Z tych części możesz łatwo złożyć własny ciąg.
Basil Bourque
11
Możesz również użyć klasy TimeUnit . Możesz zdefiniować
prywatny statyczny końcowy String FORMAT = "% 02d:% 02d:% 02d";
Właściwie jest odwrotnie, mod minut 60 poda minuty. Zobacz moją odpowiedź
Federico klez Culloca
Masz w zasadzie rację. Dość późno, dzięki za wyjaśnienie!
Ryre
-1
long d1Ms=asa.getTime();
long d2Ms=asa2.getTime();
long minute = Math.abs((d1Ms-d2Ms)/60000);
int Hours = (int)minute/60;
int Minutes = (int)minute%60;
stUr.setText(Hours+":"+Minutes);
import java.util.Scanner;
publicclassBasicElement{
publicstaticvoidmain(String[] args){
Scanner input = new Scanner(System.in);
int hours;
System.out.print("Enter the hours to convert:");
hours =input.nextInt();
int d=hours/24;
int m=hours%24;
System.out.println(d+"days"+" "+m+"hours");
}
}
Podane dane wejściowe w sekundach można przekształcić do formatu hh: mm: ss w następujący sposób:
int hours;
int minutes;
int seconds;
int formatHelper;
int input;
//formatHelper maximum value is 24 hours represented in seconds
formatHelper = input % (24*60*60);
//for example let's say format helper is 7500 seconds
hours = formatHelper/60*60;
minutes = formatHelper/60%60;
seconds = formatHelper%60;
//now operations above will give you result = 2hours : 5 minutes : 0 seconds;
Użyłem formatHelper, ponieważ dane wejściowe mogą trwać dłużej niż 86 400 sekund, czyli 24 godziny.
Jeśli chcesz, aby całkowity czas wejścia był reprezentowany przez hh: mm: ss, możesz po prostu uniknąć formatHelper.
import java.util.Scanner;
publicclassTime{
publicstaticvoidmain(String[]args){
int totMins=0;
int hours=0;
int mins=0;
Scanner sc= new Scanner(System.in);
System.out.println("Enter the time in mins: ");
totMins= sc.nextInt();
hours=(int)(totMins/60);
mins =(int)(totMins%60);
System.out.printf("%d:%d",hours,mins);
}
}
Odpowiedzi:
Jeśli twój czas jest w zmiennej o nazwie
t
int hours = t / 60; //since both are ints, you get an int int minutes = t % 60; System.out.printf("%d:%02d", hours, minutes);
To nie może być prostsze
źródło
Duration
?t
może być<0
(ujemne), to druga linia powinna byćint minutes = Math.abs(t) % 60;
.tl; dr
Duration.ofMinutes( 260L ) .toString()
… Lub…
LocalTime.MIN.plus( Duration.ofMinutes( 260L ) ).toString()
Duration
Klasy java.time zawierają parę klas reprezentujących okresy czasu.
Duration
Klasa jest na godziny-minuty-sekundy, aPeriod
to za years-miesięcy do dni.Duration d = Duration.ofMinutes( 260L );
Duration
CzęściUzyskaj dostęp do każdej części
Duration
, dzwoniącto…Part
. Te metody zostały dodane w Javie 9 i nowszych.long days = d.toDaysPart() ; int hours = d.toHoursPart() ; int minutes = d.toMinutesPart() ; int seconds = d.toSecondsPart() ; int nanos = d.toNanosPart() ;
Następnie możesz złożyć własny ciąg z tych części.
ISO 8601
Standard ISO 8601 definiuje formaty tekstowe dla wartości daty i godziny. W przypadku okresów czasu niezwiązanych z osią czasu standardowym formatem jest
PnYnMnDTnHnMnS
. TeP
znaki początku iT
oddziela rok-miesiąc-dzień od godziny-minuty-sekundy. Czyli półtorej godzinyPT1H30M
.Klasy java.time używają domyślnie formatów ISO 8601 do analizowania i generowania ciągów.
Duration
IPeriod
zajęcia używać tego konkretnego formatu standardowego. Więc po prostu zadzwońtoString
.Aby uzyskać formatowanie alternatywne, utwórz własny ciąg w języku Java 9 i nowszych ( nie w języku Java 8) za pomocą
Duration::to…Part
metod. Lub zobacz tę odpowiedź, aby użyć wyrażenia regularnego do manipulowania ciągiem w formacie ISO 8601.LocalTime
Zdecydowanie sugeruję użycie standardowego formatu ISO 8601 zamiast niezwykle niejednoznacznego i mylącego formatu zegara
04:20
. Ale jeśli nalegasz, możesz uzyskać ten efekt, hakującLocalTime
klasę. Działa to, jeśli czas trwania nie przekracza 24 godzin.Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Skąd wziąć klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Duration::to…Part
metody pokazane przez moje zmiany do tej odpowiedzi. Z tych części możesz łatwo złożyć własny ciąg.Możesz również użyć klasy TimeUnit . Możesz zdefiniować
może mieć metodę taką jak:źródło
Służy
java.text.SimpleDateFormat
do zamiany minut na godziny i minutySimpleDateFormat sdf = new SimpleDateFormat("mm"); try { Date dt = sdf.parse("90"); sdf = new SimpleDateFormat("HH:mm"); System.out.println(sdf.format(dt)); } catch (ParseException e) { e.printStackTrace(); }
źródło
Można to zrobić w ten sposób
int totalMinutesInt = Integer.valueOf(totalMinutes.toString()); int hours = totalMinutesInt / 60; int hoursToDisplay = hours; if (hours > 12) { hoursToDisplay = hoursToDisplay - 12; } int minutesToDisplay = totalMinutesInt - (hours * 60); String minToDisplay = null; if(minutesToDisplay == 0 ) minToDisplay = "00"; else if( minutesToDisplay < 10 ) minToDisplay = "0" + minutesToDisplay ; else minToDisplay = "" + minutesToDisplay ; String displayValue = hoursToDisplay + ":" + minToDisplay; if (hours < 12) displayValue = displayValue + " AM"; else displayValue = displayValue + " PM"; return displayValue; } catch (Exception e) { LOGGER.error("Error while converting currency."); } return totalMinutes.toString();
źródło
(W Kotlinie) Jeśli zamierzasz umieścić odpowiedź w TextView lub w czymś innym, możesz zamiast tego użyć zasobu ciągu:
<string name="time">%02d:%02d</string>
Następnie możesz użyć tego zasobu String, aby ustawić tekst w czasie wykonywania za pomocą:
private fun setTime(time: Int) { val hour = time / 60 val min = time % 60 main_time.text = getString(R.string.time, hour, min) }
źródło
Używam tej funkcji do moich projektów:
public static String minuteToTime(int minute) { int hour = minute / 60; minute %= 60; String p = "AM"; if (hour >= 12) { hour %= 12; p = "PM"; } if (hour == 0) { hour = 12; } return (hour < 10 ? "0" + hour : hour) + ":" + (minute < 10 ? "0" + minute : minute) + " " + p; }
źródło
Oto moja funkcja do konwersji a
second
,millisecond
doday,hour,minute,second
public static String millisecondToFullTime(long millisecond) { return timeUnitToFullTime(millisecond, TimeUnit.MILLISECONDS); } public static String secondToFullTime(long second) { return timeUnitToFullTime(second, TimeUnit.SECONDS); } public static String timeUnitToFullTime(long time, TimeUnit timeUnit) { long day = timeUnit.toDays(time); long hour = timeUnit.toHours(time) % 24; long minute = timeUnit.toMinutes(time) % 60; long second = timeUnit.toSeconds(time) % 60; if (day > 0) { return String.format("%dday %02d:%02d:%02d", day, hour, minute, second); } else if (hour > 0) { return String.format("%d:%02d:%02d", hour, minute, second); } else if (minute > 0) { return String.format("%d:%02d", minute, second); } else { return String.format("%02d", second); } }
Testowanie
public static void main(String[] args) { System.out.println("60 => " + secondToFullTime(60)); System.out.println("101 => " + secondToFullTime(101)); System.out.println("601 => " + secondToFullTime(601)); System.out.println("7601 => " + secondToFullTime(7601)); System.out.println("36001 => " + secondToFullTime(36001)); System.out.println("86401 => " + secondToFullTime(86401)); }
Wynik
60 => 1:00 101 => 1:41 601 => 10:01 7601 => 2:06:41 36001 => 10:00:01 86401 => 1day 00:00:01
Mam nadzieję, że to pomoże
źródło
Mod 60 minut daje godziny z pozostałymi minutami.
http://www.cafeaulait.org/course/week2/15.html
źródło
long d1Ms=asa.getTime(); long d2Ms=asa2.getTime(); long minute = Math.abs((d1Ms-d2Ms)/60000); int Hours = (int)minute/60; int Minutes = (int)minute%60; stUr.setText(Hours+":"+Minutes);
źródło
Wypróbuj ten kod:
import java.util.Scanner; public class BasicElement { public static void main(String[] args){ Scanner input = new Scanner(System.in); int hours; System.out.print("Enter the hours to convert:"); hours =input.nextInt(); int d=hours/24; int m=hours%24; System.out.println(d+"days"+" "+m+"hours"); } }
źródło
Podane dane wejściowe w sekundach można przekształcić do formatu hh: mm: ss w następujący sposób:
int hours; int minutes; int seconds; int formatHelper; int input; //formatHelper maximum value is 24 hours represented in seconds formatHelper = input % (24*60*60); //for example let's say format helper is 7500 seconds hours = formatHelper/60*60; minutes = formatHelper/60%60; seconds = formatHelper%60; //now operations above will give you result = 2hours : 5 minutes : 0 seconds;
Użyłem formatHelper, ponieważ dane wejściowe mogą trwać dłużej niż 86 400 sekund, czyli 24 godziny.
Jeśli chcesz, aby całkowity czas wejścia był reprezentowany przez hh: mm: ss, możesz po prostu uniknąć formatHelper.
Mam nadzieję, że to pomoże.
źródło
input
wynosi 7500, to wynik wynosi 7500 godzin, 5 minut i 0 sekund, co jest oczywiście błędne. A w pytaniu w ogóle nie było sekund.int mHours = t / 60; //since both are ints, you get an int int mMinutes = t % 60; System.out.printf("%d:%02d", "" +mHours, "" +mMinutes);
źródło
%d
do formatowania wartości ciągów"" +mHours
i"" +mMinutes
?import java.util.Scanner; public class Time{ public static void main(String[]args){ int totMins=0; int hours=0; int mins=0; Scanner sc= new Scanner(System.in); System.out.println("Enter the time in mins: "); totMins= sc.nextInt(); hours=(int)(totMins/60); mins =(int)(totMins%60); System.out.printf("%d:%d",hours,mins); } }
źródło