0

我正在尝试创建一个日历类,在其中我初始化一个默认日期。当用户创建类时,默认构造函数分配值“01-01-2012”。如果用户输入有效日期作为字符串参数,则第二个构造函数将分配新日期。如果不是,我希望类给出友好警告,这不是有效日期并继续保持默认分配。(例如。如果用户输入“02/31/2012”。这将引发警告并继续创建实例,同时将默认设置为“01-01-2021”。)我还创建了一个设置日期的方法,这样可以一旦他们给出有效日期,稍后再更改。为了做到这一点,我应该如何使用第二个构造函数?还是有更好更有效的流程来做到这一点?

import java.time.*;
import java.time.format.DateTimeFormatter;



public class CalendarDate {

    private String date;
    private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMMM dd uuuu");
  
    //constructor sets date to January 1, 2012
    CalendarDate(){

       date = "01-01-2012";
    };

    /**
     *  Initializes object's chosen date
     * 
     * @param day - initializes day
     * @param month - initialazes month
     * @param year - initialazes year
     */
    public CalendarDate(String date){

        this.date = date;

    } // 1 - parameter Constructor


    /**
     * 
     *  Sets new date given to this object
     * 
     * @param date sets new date to object
     */
    public void setDate(String date){

        this.date = date;
    }

    /**
     * 
     * Returns objects set date.
     * 
     * @return Returns set date.
     */
    public String getDate(){

        LocalDate getDate = LocalDate.parse(date);
        String formattedDate = getDate.format(formatter);
        return formattedDate;
    }

    /**
     * 
     * Returns object's date
     * 
     * @return Returns object's date
     */
    public String getNextDate(){

        LocalDate dateTime = LocalDate.parse(date);
        LocalDate returnValue = dateTime.plusDays(1);
        String newNextDate = formatter.format(returnValue);
        return newNextDate;
     
    }

    /**
     *  Returns prior date from the object's given date.
     * 
     * @return
     */
    public String getPriorDate(){

        return " ";
    
    }

    /**
     *  Returns the day of the week from the object's given date.
     * 
     * @return
     */
    public String getDayOfWeek(){

        return " ";
    
    }



}


public class Calendar extends CalendarDate{

    public static void main(String[] args){

        CalendarDate testDate = new CalendarDate("06-07-1992");

       testDate.getDate();
        

    }
}

这是我到目前为止所拥有的,我想使用 LocalDate 和 DateTimeFormatter。任何事情都会有所帮助。

4

2 回答 2

1

中指定的格式DateTimeFormatter必须与输入字符串匹配,例如

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

public class Main {
    public static void main(String[] args) {
        String strDate = "01-01-2012";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-uuuu", Locale.ENGLISH);
        LocalDate date = LocalDate.parse(strDate, dtf);
        System.out.println(date);

        // Output in a custom format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM dd uuuu", Locale.ENGLISH);
        String formatted = formatter.format(date);
        System.out.println(formatted);
    }
}

输出:

2012-01-01
January 01 2012

ONLINE DEMO

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-09-11T20:13:03.220 回答
1

我对您的设计提出以下建议。我认为如果你有一个副作用,他们也会修复你的错误。

private String date;

不要将日期保留为字符串。把它当作一个LocalDate对象。就像您将数字保存在int变量中,将布尔值保存在boolean变量中一样,而不是字符串。所以声明变成:

private LocalDate date;

这显然意味着我们将不得不更改您方法中的大部分代码。

CalendarDate(){

   date = "01-01-2012";
};

在上面的构造函数中,您可以of使用LocalDate. 例如:

   date = LocalDate.of(2012, Month.JANUARY, 1);

你必须:

 * @param day - initializes day
 * @param month - initialazes month
 * @param year - initialazes year

您的 Javadoc 参数似乎与您的构造函数不符,您需要修复它们。

public CalendarDate(String date){

    this.date = date;

} // 1 - parameter Constructor

有一个带String参数的构造函数会很方便。在您的 Javadoc 注释中,请记住提及字符串的预期格式。由于我现在已更改date为 a LocalDate,因此您需要先解析字符串,然后再分配给date. 我建议您让任何DateTimeParseException传播出该方法,以便用户知道解析是否出错。同样在您的 Javadoc 文档中,该方法可能会抛出:

 * @throws DateTimeParseException
 *   if the string is not in the expected format or does not denote a valid date

更远:

public void setDate(String date){

同样是一种可能很方便的方法,现在需要解析字符串。并在适当的情况下抛出异常。

public String getDate(){

    LocalDate getDate = LocalDate.parse(date);
    String formattedDate = getDate.format(formatter);
    return formattedDate;
}

您现在可以稍微简化一下上述方法,因为它不再需要解析日期,只需对其进行格式化。至少还有一种方法也是如此。

于 2021-09-12T09:33:18.697 回答