我知道延迟时间的方法,例如,从22:50延迟到2:10。我在延迟方法的参数中插入了200,我担心将时间向前移动的方法无法正常工作,因为我将时间设置为1:20,将100分钟(1小时40分钟)向前移动到23:40 。当我尝试运行代码时,向前移动时间后输出显示为1:40。 moveForward(int lostMinute)方法的哪一行错?

class Time
{
    private int hour; // between 0 - 23
    private int minute; // between 0 - 59
    public Time()
    {
        this(0, 0);
    }
    public Time(int hr, int min)
    {
        hour = (hr >= 0 && hr < 24) ? hr : 0;
        minute = (min >= 0 && min < 60) ? min : 0;
    }
    public int getHour()
    {
        return hour;
    }
    public int getMinute()
    {
        return minute;
    }
    public void setHour(int hour)
    {
        this.hour = (hour >= 0 && hour < 24) ? hour : 0;
    public void setMinute(int minute)
    {
        this.minute = (minute >= 0 && minute < 60) ? minute : 0;
    }
    public String toString()
    {
        return String.format("%02d:%02d", hour, minute);
    }
    public void delay(int newMinute)
    {
        minute = minute + newMinute;
        if(minute >= 60)
        {
            // (minute / 60) is an integer division and truncates the remainder, which refers to (minute % 60)
            hour = hour + (minute / 60);
            minute = minute % 60;
            if(hour >= 24)
            {
                hour = hour % 24;
            }
        }
    }
    public void moveForward(int lostMinute)
    {
        if(minute < lostMinute)
        {
            hour = hour - ((60 + minute) / 60);
            minute = (minute + 60) % 60;
            if(hour < 0)
            {
                hour = (24 + hour) % 24;
            }
        }
        else
        {
            minute = minute - lostMinute;
        }
    }
}


我看到delay()正常运行,而moveForward()却不正常。为了使时间符号更清晰地排序,我使用了String.format("%02d:%02d")来指示00:00到23:59之间的时间。请注意,我没有使用import java.util.Calender;或'import java.util.Date;因为我的项目的一部分是将数组按小时排序,然后按分钟排序。例如,如果我们尝试创建巴士总站项目,则假定日期和日历在时间表中无关紧要。

public class MainTime
{
    public static void main(String[] args)
    {
        Time t1 = new Time(23:50);
        Time t2 = new Time(1:20);
        Time t3 = new Time(4:50);
        Time t4 = new Time(18:30);
        Time t5 = new Time(14:15);
        t1.delay(200);
        t2.moveForward(100);
        t3.delay(100);
        t4.moveForward(20);
        t5.moveForward(160);
        System.out.println(t1.toString());
        System.out.println(t2.toString());
        System.out.println(t3.toString());
        System.out.println(t4.toString());
        System.out.println(t5.toString());
    }
}


约束条件是:时间变化大于参数中的分钟,并且小时将为零。当我在NetBeans中运行代码时,当我在t1方法中将200添加到23:50时,delay(newMinute)的比例为2:10;当我在t2方法中从1:20减去100时,moveForward(lostMinute)的比例为1:40;当我在t3的4:50中添加100时,delay(newMinute)的时间是6:30;当我在t4的18:30中减去20时,moveForward(lostMinute)的比例为18:10;当我从t5的14:15中减去160时,moveForward(lostMinute)的值为14:-25。执行后的变量t2t5实际上应该分别为23:40和11:35。
从给定时间减去分钟后,请确定public void moveForward(int lostMinute)中的哪些行输出不正确。
如果分钟数变为零,则60和模数符号%可能会有用;如果小时数为零,则24和模数符号%可能会有用。我希望moveForward(lostMinute)minute < 0hour < 0的情况下都能正常工作。

最佳答案

java.time

    LocalTime t1 = LocalTime.of(23, 50);
    t1 = t1.plusMinutes(200);
    System.out.println(t1.toString()); // 03:10

    LocalTime t2 = LocalTime.of(1, 20);
    t2 = t2.minusMinutes(100);
    System.out.println(t2.toString()); // 23:40

    LocalTime t3 = LocalTime.of(4, 50);
    t3 = t3.plusMinutes(100);
    System.out.println(t3.toString()); // 06:30

    LocalTime t4 = LocalTime.of(18, 30);
    t4 = t4.minusMinutes(20);
    System.out.println(t4.toString()); // 18:10

    LocalTime t5 = LocalTime.of(14, 15);
    t5 = t5.minusMinutes(160);
    System.out.println(t5.toString()); // 11:35


输出以注释形式给出。我想这就是你想要的。所以不要重新发明轮子。不用滚动自己的Time类,而使用LocalTime。它在那里供您使用,它已经为您开发和测试。 LocalTime是介于00:00到23:59:59.999999999之间的一天中的时间。除了包括秒和几分之一秒,它与您的间隔一致。如果您从未将秒数设置为0以外的值,则不会通过toString方法将其打印出来。另外,LocalTime实现了Comparable,因此排序很简单。

请注意,LocalTime对象是不可变的,因此它有一些方法可以返回具有新值的新LocalTime对象,而不是mutator方法。上面的plusMinutesminusMinutes已经证明了这一点。另外,您需要myLocalTime.setHour(17);等来代替myLocalTime = myLocalTime.withHour(17);

您的代码出了什么问题?

您的moveForward方法似乎要正确处理小时,如果要将其移回前一小时,例如从14:05到13:55或从14:55到13:05。在这种情况下,您永远不会减去lostMinutes,我认为您应该以某种方式。当minute为0–59时,((60 + minute) / 60)始终为1,因此您始终精确地减去1小时,而不是2或更多。

通常,delaymoveForward参数的预期范围尚不清楚。我认为应该将它们记录在案,并针对已证明的限制对论据进行验证。

链接

Oracle tutorial: Date Time解释如何使用java.time

10-06 14:04