我怎样才能将有效日期作为字符串输入,但如果不保留默认构造函数分配的默认值?
How can I can take in a valid date as a string but if not keep the default assigned byt the default constructor?
我正在尝试创建一个日历 class,我在其中初始化了一个默认日期。当用户创建 class 时,默认构造函数分配值“01-01-2012”。如果用户输入一个有效日期作为字符串参数,第二个构造函数将分配新的 date.If 而不是我希望 class 给出一个友好的警告,这不是一个有效日期并继续并保留默认分配。(例如,如果用户输入“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。任何事情都会有所帮助。
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
详细了解 modern Date-Time API* from Trail: Date Time。
* 无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用 ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and 。
我对您的设计提出以下建议。我认为如果您有错误,他们也会修复您的错误作为副作用。
private String date;
不要将日期保存为字符串。将其保存为 LocalDate
对象。就像您将数字保存在 int
变量中,将 Booelan 值保存在 boolean
变量中,而不是字符串中。所以声明变成:
private LocalDate date;
这显然意味着我们将不得不更改您的方法中的大部分代码。
CalendarDate(){
date = "01-01-2012";
};
在上面的构造函数中,您可以使用 LocalDate
的 of
工厂方法之一。例如:
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
更改为 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;
}
你现在可以稍微简化一下上面的方法,因为它不再需要解析日期,只需要格式化它。至少还有一种方法也是如此。
我正在尝试创建一个日历 class,我在其中初始化了一个默认日期。当用户创建 class 时,默认构造函数分配值“01-01-2012”。如果用户输入一个有效日期作为字符串参数,第二个构造函数将分配新的 date.If 而不是我希望 class 给出一个友好的警告,这不是一个有效日期并继续并保留默认分配。(例如,如果用户输入“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。任何事情都会有所帮助。
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
详细了解 modern Date-Time API* from Trail: Date Time。
* 无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用 ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and
我对您的设计提出以下建议。我认为如果您有错误,他们也会修复您的错误作为副作用。
private String date;
不要将日期保存为字符串。将其保存为 LocalDate
对象。就像您将数字保存在 int
变量中,将 Booelan 值保存在 boolean
变量中,而不是字符串中。所以声明变成:
private LocalDate date;
这显然意味着我们将不得不更改您的方法中的大部分代码。
CalendarDate(){
date = "01-01-2012";
};
在上面的构造函数中,您可以使用 LocalDate
的 of
工厂方法之一。例如:
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
更改为 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;
}
你现在可以稍微简化一下上面的方法,因为它不再需要解析日期,只需要格式化它。至少还有一种方法也是如此。