Як перетворити хвилини в години і хвилини (год-год: мм) у Java


81

Мені потрібно перевести хвилини в години і хвилини в Java. Наприклад 260 має бути 4:20. може хто-небудь допомогти мені, як це зробити перетворити його.


24 години або 12 годин з ранку та вечора?
eat_a_lemon

Дивіться також stackoverflow.com/questions/2704473
trashgod

Відповіді:


193

Якщо ваш час у змінній, що називається t

int hours = t / 60; //since both are ints, you get an int
int minutes = t % 60;
System.out.printf("%d:%02d", hours, minutes);

Легше не могло бути


Чи є спосіб досягти цього за допомогою Java 8 Duration?
Ігор Ганапольський

3
Якщо tможе бути <0(негативним), тоді повинен бути другий рядок int minutes = Math.abs(t) % 60;.
wittich

1
а також, якщо ви хочете am або pm з часом, додайте цю умову String amOrPm; if (timeInminutes> = 720) amOrPm = "PM"; ще amOrPm = "AM"; Рядок convertTime = годин + ":" + хвилин + amOrPm;
SFAH

Що робити з мовою, яка не є AM / PM? Це лише часткове, не локалізоване рішення.
рор

29

tl; д-р

Duration.ofMinutes( 260L )
        .toString()

PT4H20M

... або ...

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

04:20

Duration

Класи java.time включають пару класів, що представляють проміжки часу. DurationКлас на годинник-хвилини-секунди, а Periodдля років- місяців-днів.

Duration d = Duration.ofMinutes( 260L );

Duration частин

Доступ до кожної частини програми здійснюється Durationза допомогою дзвінка to…Part. Ці методи були додані в Java 9 та пізніших версіях.

long days = d.toDaysPart() ;
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
int seconds = d.toSecondsPart() ;
int nanos = d.toNanosPart() ;

Потім ви можете зібрати свій власний рядок із цих деталей.

ISO 8601

Стандарт ISO 8601 визначає текстові формати значень дати та часу. Для проміжків часу, не приєднаних до часової шкали, стандартним форматом є PnYnMnDTnHnMnS. В Pвідзначає початок, і Tроз'єднує року-місяць-дні від годин-хвилини-секунд. Отже, півтори години PT1H30M.

Класи java.time використовують типово формати ISO 8601 для синтаксичного аналізу та генерації рядків. DurationІ Periodкласи використовують цей конкретний стандартний формат. Тож просто телефонуйте toString.

String output = d.toString(); 

PT4H20M

Для альтернативного форматування створіть свій власний рядок у Java 9 та пізніших версіях ( не в Java 8) за допомогою Duration::to…Partметодів. Або перегляньте цю відповідь щодо використання регулярного виразу для маніпулювання форматованим рядком ISO 8601.

LocalTime

Я настійно рекомендую використовувати стандартний формат ISO 8601 замість надзвичайно неоднозначного та заплутаного формату годинника 04:20. Але якщо ви наполягаєте, ви можете отримати цей ефект, зламавши LocalTimeклас. Це працює, якщо ваша тривалість не перевищує 24 годин.

LocalTime hackUseOfClockAsDuration = LocalTime.MIN.plus( d );
String output = hackUseOfClockAsDuration.toString();

04:20


Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Проект Joda-Time , який зараз перебуває в режимі обслуговування , радить перейти на класи java.time .

Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .

Де отримати класи java.time?

  • Java SE 8 і SE 9 і пізніших версій
    • Вбудований.
    • Частина стандартного Java API із комплексною реалізацією.
    • Java 9 додає деякі незначні функції та виправлення.
  • Java SE 6 і SE 7
    • Значна частина функцій java.time переноситься назад на Java 6 і 7 у ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


1
Приємно, я шукаю щось подібне, але я хотів би отримати результат як "4h 20m" або "4h 20min", а не "PT4H20M" або "04:20". Я думаю, мені доведеться використовувати якийсь спосіб форматування?
aditsu кинув, бо SE є ЗЛО

@aditsuquitbecauseSEisEVIL Java 9 підніс Duration::to…Partметоди, показані мої правки, до цієї відповіді. Ви можете легко зібрати власну струну з цих деталей.
Василь Бурк

11

Ви також можете використовувати клас TimeUnit . Ви могли б визначити

приватний статичний фінальний рядок FORMAT = "% 02d:% 02d:% 02d";
може мати такий метод, як:

відкритий статичний рядок parseTime (довгі мілісекунди) {
      повернути String.format (FORMAT,
              TimeUnit.MILLISECONDS.toHours (мілісекунди),
              TimeUnit.MILLISECONDS.toMinutes (мілісекунди) - TimeUnit.HOURS.toMinutes (
              TimeUnit.MILLISECONDS.toHours (мілісекунди)),
              TimeUnit.MILLISECONDS.toSeconds (мілісекунди) - TimeUnit.MINUTES.toSeconds (
              TimeUnit.MILLISECONDS.toMinutes (мілісекунди)));
   }

Я знаю, що це трохи довше, ніж код у прийнятій відповіді, але IMHO це також зрозуміліше. Я віддаю перевагу цьому.
Оле В. В.

11

Використовуйте java.text.SimpleDateFormatдля перетворення хвилин у години та хвилини

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

2

Це можна зробити так

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

2
Боже, це багатослівно - так само, як FizzBuzz Enterprise Edition: theospears.com/blog/2007/08/11/fizzbuzz-enterprise-edition
ya23

1
Яке відношення це має до валюти?
fdermishin

2

(У Kotlin) Якщо ви збираєтеся помістити відповідь у TextView або щось інше, ви можете замість цього використати рядовий ресурс:

<string name="time">%02d:%02d</string>

А потім ви можете використовувати цей String ресурс, щоб потім встановити текст під час виконання, використовуючи:

private fun setTime(time: Int) {
    val hour = time / 60
    val min = time % 60
    main_time.text = getString(R.string.time, hour, min)
}

1

Я використовую цю функцію для своїх проектів:

 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;
}

1

Ось моя функція для перетворення a second, millisecondtoday,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);
    }
}

Тестування

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

Вихідні дані

60 => 1:00
101 => 1:41
601 => 10:01
7601 => 2:06:41
36001 => 10:00:01
86401 => 1day 00:00:01

Сподіваюся, це допоможе



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

вище двох буде пригнічувати президенти
розробник

-1

Спробуйте цей код:

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

    }
}

2
Це були хвилини до годин і хвилин
keyser

-1

Вказаний вхід за секунди ви можете перетворити у формат hh: mm: ss таким чином:

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;

Я використовував formatHelper, оскільки введення може бути більше 86 400 секунд, що становить 24 години.

Якщо вам потрібен загальний час введення, представлений hh: mm: ss, ви можете просто уникнути formatHelper.

Сподіваюся, це допоможе.


1
Не працює. Якщо inputдорівнює 7500, то результат - 7500 годин, 5 хвилин і 0 секунд, що, очевидно, неправильно. І в запитанні взагалі не йшлося про секунди.
fdermishin

@fdermishin правильний. Спробуйте в Інтернеті!
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);

1
Чому ви використовуєте цілочисельний формат %dдля форматування рядкових значень "" +mHoursі "" +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);
    }
}

Чим це відрізняється від прийнятої відповіді?
фдермішин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.