如何在Java中将分钟转换为小时和分钟(hh:mm)?

99

我需要在Java中将分钟转换为小时分钟。例如,260分钟应该是4:20

有人能帮我如何进行这样的转换吗?


24小时制还是12小时制带上午和下午? - eat_a_lemon
请参阅https://dev59.com/dnE85IYBdhLWcg3wl0nF。 - trashgod
转换为 Duration,例如 Duration dur = Duration.ofMinutes(260);。通过 String.format(Locale.forLanguageTag("en-IN"), "%d:%02d", dur.toHours(), dur.toMinutesPart()) 进行格式化。结果:4:20 - Ole V.V.
15个回答

226
如果你的时间存储在一个叫做 t 的变量中:
int hours   = t / 60;   // since both are ints, you get an int
int minutes = t % 60;
System.out.printf("%d:%02d", hours, minutes);

这再简单不过了。


2021年补充说明

请注意,本答案仅涉及将分钟转换为小时+分钟的字面意义,与时间、时区、上午/下午等无关。

如果您需要更好地控制这种情况,即您处理的是时间点而不仅仅是分钟和小时数量,请参见下面Basil Bourque的答案


有没有办法使用Java 8的“Duration”来实现这个? - IgorGanapolsky
3
如果t可以小于0(负数),那么第二行应该是int minutes = Math.abs(t) % 60; - wittich
1
如果您想在时间中添加am或pm,请添加以下条件: String amOrPm; if (timeInminutes>=720) amOrPm="PM"; else amOrPm="AM"; String convertedTime=hours +":" +minutes+amOrPm; - SFAH
非AM/PM语言环境该怎么办?这只是部分的、非本地化的解决方案。 - ror

42

简而言之

Duration.ofMinutes( 260L )
        .toString()

PT4H20M

...或者...

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

04:20

持续时间

Java.time类包括一对类来表示时间跨度。Duration类用于表示小时-分钟-秒,而Period则用于表示年-月-日。

Duration d = Duration.ofMinutes( 260L );

Duration 的部分

通过调用 to...Part 来访问 Duration 的每个部分。这些方法在 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标准定义了日期时间值的文本格式。对于未与时间轴相关联的时间跨度,标准格式PnYnMnDTnHnMnSP表示开始,T将年月日与时分秒分开。因此,一个半小时是PT1H30M

java.time类默认使用ISO 8601格式来解析和生成字符串。 DurationPeriod类使用此特定的标准格式。所以只需调用toString即可。

String output = d.toString(); 

PT4H20M

要进行替代格式化,请在Java 9及更高版本中使用Duration::to…Part方法构建自己的字符串(不是在Java 8中)。或者查看this Answer,了解如何使用正则表达式来操作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.DateCalendarSimpleDateFormat

Joda-Time 项目目前处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请查看Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310
在哪里获取java.time类? 这个ThreeTen-Extra项目扩展了java.time的附加类。该项目是java.time可能未来添加的一个试验场。你可能会在这里找到一些有用的类,如Interval, YearWeek, YearQuarter更多

1
不错,我正在寻找这样的东西,但我想要的结果是“4小时20分钟”或“4小时20分”,而不是“PT4H20M”或“04:20”。我猜我得使用某种格式化方法? - aditsu quit because SE is EVIL
Java 9 带来了 Duration::to…Part 方法,如我对此答案的编辑所示。您可以轻松地从这些部分组装自己的字符串。 - Basil Bourque

15

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

14

你也可以使用 TimeUnit 类。你可以定义一个像下面这样的方法:

private static final String FORMAT = "%02d:%02d:%02d";

public static String parseTime(long milliseconds) {
    return String.format(FORMAT,
        TimeUnit.MILLISECONDS.toHours(milliseconds),
        TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)),
        TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds))
    );
}
该方法使用了TimeUnit类来处理时间单位。它会将给定的毫秒数转换为时、分和秒,然后使用String.format()方法将它们格式化成“hh:mm:ss”的形式并返回。在这个方法中,我们定义了一个常量FORMAT,用于指定输出格式为两位数的小时数、分钟数和秒数。

我知道这段代码比被接受的答案中的代码要长一些,但在我看来它更加清晰易懂。我更喜欢这个。 - Ole V.V.

4
(在Kotlin中)如果你要将答案放入TextView或其他地方,你可以使用字符串资源代替:
<string name="time">%02d:%02d</string>

然后,您可以使用此字符串资源,在运行时使用以下方式设置文本:

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

4

我在我的项目中使用这个函数:

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

3
可以这样做
        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企业版一样:http://www.theospears.com/blog/2007/08/11/fizzbuzz-enterprise-edition/ - ya23
1
这与货币有什么关系? - fdermishin

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;

由于输入可能超过86,400秒,即24小时,因此我使用了formatHelper。

如果您希望以hh:mm:ss表示输入的总时间,则可以避免使用formatHelper。

希望这能帮到您。


1
不工作。如果“input”是7500,则结果为7500小时,5分钟和0秒,显然是错误的。而且问题根本没有提到秒钟。 - fdermishin
@fdermishin是正确的。在线尝试! - General Grievance

1
这里是将 毫秒 转换为 天,小时,分钟,秒 的函数。
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

希望它有所帮助。

0

实际上相反,分钟模60将给你分钟。请看我的答案。 - Federico klez Culloca
你说得很对。这边的时间已经很晚了,谢谢你澄清了! - Ryre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接