Jak przekonwertować minuty na godziny i minuty (gg: mm) w java

81

Muszę zamienić minuty na godziny i minuty w java. Na przykład 260 powinno być 4:20. czy ktoś może mi pomóc, jak to zrobić.

lakshmi
źródło
24-godzinny czy 12-godzinny czas z am i pm?
eat_a_lemon
Zobacz też stackoverflow.com/questions/2704473
trashgod,

Odpowiedzi:

193

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

Federico klez Culloca
źródło
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.
ror
29

tl; dr

Duration.ofMinutes( 260L )
        .toString()

PT4H20M

… Lub…

LocalTime.MIN.plus( 
    Duration.ofMinutes( 260L ) 
).toString()

04:20

Duration

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();

04:20


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, i SimpleDateFormat.

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 .

Basil Bourque
źródło
1
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";
może mieć metodę taką jak:

public static String parseTime (długie milisekundy) {
      return String.format (FORMAT,
              TimeUnit.MILLISECONDS.toHours (milisekundy),
              TimeUnit.MILLISECONDS.toMinutes (milisekundy) - TimeUnit.HOURS.toMinutes (
              TimeUnit.MILLISECONDS.toHours (milisekundy)),
              TimeUnit.MILLISECONDS.toSeconds (milisekundy) - TimeUnit.MINUTES.toSeconds (
              TimeUnit.MILLISECONDS.toMinutes (milisekundy)));
   }
Walters
źródło
Wiem, że to trochę dłużej niż kod w zaakceptowanej odpowiedzi, ale IMHO jest też jaśniejsze. Wolę to.
Ole VV
11

Służy java.text.SimpleDateFormatdo zamiany minut na godziny i minuty

SimpleDateFormat 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();
}
Athar Iqbal
źródło
2

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();
Priyanka
źródło
2
O rany, to gadatliwe - tak jak FizzBuzz Enterprise Edition: theospears.com/blog/2007/08/11/fizzbuzz-enterprise-edition
ya23
1
Co to ma wspólnego z walutą?
fdermishin
2

(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)
}
Anthony Cannon
źródło
1

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;
}
Shohan Ahmed Sijan
źródło
1

Oto moja funkcja do konwersji a second, milliseconddoday,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

Phan Van Linh
źródło
-1

Mod 60 minut daje godziny z pozostałymi minutami.

http://www.cafeaulait.org/course/week2/15.html

Ryre
źródło
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); 
deweloper
źródło
powyżej dwa będą tłumić liczby prezenterów
deweloper
-1

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");     

    }
}
Jayaramachandran P
źródło
2
Były minuty do godzin i minut
keyer
-1

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.

LightinDarknessJava
źródło
1
Nie działa. Jeśli inputwynosi 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.
fdermishin
@fdermishin jest poprawne. Wypróbuj online!
Calculuswhiz
-1
int mHours = t / 60; //since both are ints, you get an int
int mMinutes = t % 60;
System.out.printf("%d:%02d", "" +mHours, "" +mMinutes);
Jigar Patel
źródło
1
Dlaczego używasz formatu liczb całkowitych %ddo formatowania wartości ciągów "" +mHoursi "" +mMinutes?
fdermishin
-1
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);
    }
}
Janeth Fernando
źródło
Czym różni się to od zaakceptowanej odpowiedzi?
fdermishin