You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法为Calendar添加天数:有声图书到期日显示异常求助

解决有声图书到期日始终显示固定值的问题

嘿,从你描述的情况来看,问题几乎肯定出在到期日的赋值或者toString()的引用逻辑上!咱们来拆解一下可能的原因和修复方法:

最常见的坑:硬编码了到期日

先看你给出的toString()片段,到期日部分是不是直接写死成3/5了?比如代码是这样的:

str += "\n\t Due Date: 3/5";

如果是这样,那不管你怎么设置借阅时间,toString()都会输出这个固定值——这完全是硬编码的锅!你需要把这里改成引用存储到期日的实例变量,比如dueDate。

第二个可能:到期日变量没被正确赋值

如果你已经有dueDate这个变量,那大概率是你在借阅图书时没有计算并更新它。比如你需要在借阅方法里做这样的操作(以Java为例):

// 假设你的Book类有一个LocalDate类型的dueDate成员变量
public void checkOut() {
    // 计算当前日期加14天,赋值给当前图书的到期日
    this.dueDate = LocalDate.now().plusDays(14);
}

要是你从来没调用过类似的方法给dueDate赋值,它就会保持初始值(比如你测试时写的3/5),自然不会变。

第三个坑:误用了静态变量

如果你把dueDate定义成了static类型:

private static LocalDate dueDate;

那所有图书对象都会共享这同一个到期日变量——一旦某个操作把它设成3/5,所有图书的toString()都会显示这个值。解决方法就是去掉static,让每本图书都有自己的dueDate实例变量。

修复后的完整toString()示例

最后给你一个正确的toString()写法参考:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Audiobook {
    private String title;
    private String narrator;
    private int year;
    private LocalDate dueDate; // 实例变量,非静态

    // 借阅方法
    public void checkOut() {
        this.dueDate = LocalDate.now().plusDays(14);
    }

    @Override
    public String toString() {
        // 可以把日期格式化成更友好的形式,比如MM/dd/yyyy
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        String formattedDueDate = dueDate != null ? dueDate.format(formatter) : "Not checked out";
        
        String str = "\nThe specs of this audiobook are: ";
        str += "\n\t Title: " + title;
        str += "\n\t Narrator: " + narrator;
        str += "\n\t Year: " + year;
        str += "\n\t Due Date: " + formattedDueDate;
        return str;
    }
}

这样调整后,每次调用checkOut()方法,图书的到期日就会被设置成当前日期加14天,toString()也会正确显示这个动态计算的值啦!

内容的提问来源于stack exchange,提问作者ElijahLee Hedrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:37:05