【问题标题】:Converting 24 format to 12 format with updateDisplay()使用 updateDisplay() 将 24 格式转换为 12 格式
【发布时间】:2018-12-05 06:34:49
【问题描述】:

我被要求仅使用 updateDisplay() 方法来更改此时钟显示中小时的格式,一切都可以完美运行,小时可以到达下午 12:59 并使用方法 timeTick() 它到达下午 1:00 但是再次使用 timeTick() 后,它再次进入凌晨 1:01。我该如何解决这个问题?

public class ClockDisplay
{
    private NumberDisplay hours;
    private NumberDisplay minutes;
    private String displayString;   

    public ClockDisplay()
    {
        hours = new NumberDisplay(24);
        minutes = new NumberDisplay(60);
        updateDisplay();
    }

    public ClockDisplay(int hour, int minute)
    {
        hours = new NumberDisplay(24);
        minutes = new NumberDisplay(60);
        setTime(hour, minute);
    }

    public void timeTick()
    {
        minutes.increment();
        if(minutes.getValue() == 0) {  // it just rolled over!
            hours.increment();
        }
        updateDisplay();
    }

    public void setTime(int hour, int minute)
    {
        hours.setValue(hour);
        minutes.setValue(minute);
        updateDisplay();
    }

    public String getTime()
    {
        return displayString;
    }    

    private void updateDisplay()
    {
        int h = hours.getValue()%12;
        String format = (hours.getValue()/12 == 0 ? "AM":"PM");
        if(h == 0)
        {
            h = 12;
        }
        else if(hours.getValue() > 12)
        {
            hours.setValue(hours.getValue() - 12);
        }
        displayString = hours.getDisplayValue() + ":" + 
        minutes.getDisplayValue() + format;
    }
}

【问题讨论】:

  • 为什么不使用 Java 运行时库中内置的日期/时间格式化方法?
  • 请发布完整的包和对象名称和/或您是否使用任何特定的日期库。此外,建议使用可重现该错误的示例可运行程序。
  • 因为老师告诉我只能用这种方法改变格式。
  • 您只想在小时数小于 12 时打印“AM”,否则打印“PM”。您的线路设置format 没有这样做。
  • 所以我需要以另一种方式更改格式。

标签: java time time-format


【解决方案1】:

怎么了?当时间到达下午 1 点时,您的 updateDisplay 方法将小时显示的值设置回 1。现在您的时钟显示对象又回到了 1 时的状态AM,也就是说,你无法区分这两次。

如何解决?我建议你引入一个实例变量(字段)来保存我们是在一天中的上午还是下午时段的信息。您可以使用布尔变量或引入带有两个常量的enum,例如AMPM。然后你需要在timeTick 方法和setTime 方法中设置这个变量。然后使用这个变量来决定是在updateDisplay 方法中显示字符串AM 还是PM 将相当简单。

如果要求您执行此操作不添加新字段:那么您需要让 hours 显示中的小时数显示为 23,以便跟踪您是否在上午或一天中的下午时间。所以在updateDisplay 中不要设置小时值。仅在生成的显示字符串中将 12 代替 0 和 1 到 11 代替 13 到 23。

对于生产代码:在现实生活中,人们不会使用像您这样的设计,并且会严重依赖标准库类来处理时间。模型(当前时间)和表示(打印的字符串)之间会有更清晰的分离。所以当前时间将保存在LocalTime

    private LocalTime time;

将时间提前 1 分钟:

        time = time.plusMinutes(1);

为了显示时间,您将使用DateTimeFormatter

    private static final DateTimeFormatter TIME_FORMATTER
            = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);

这样显示字符串是这样创建的:

        displayString = time.format(TIME_FORMATTER);

代码未经测试,如有错字请见谅。

【讨论】:

  • 感谢您的回答,我从来没有想过有一个实例来保存信息。对不起,我不能给你一个大拇指
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多