我正在用Java编写一个程序,根据公历来接受和验证日期。我对错误条目的公共布尔setDate(String aDate)函数假设将boolean goodDate变量更改为false。该变量假设在调用时告诉toString函数输出“Invalid Entry”但它没有。我的公共布尔setDate(int d,int m,int y)函数工作正常。我只将问题部分作为一长串代码包含在内。感谢
public boolean setDate(int day, int month, int year){
// If 1 <= day <= 31, 1 <= month <= 12, and 0 <= year <= 9999 & the day match with the month
// then set object to this date and return true
// Otherwise,return false (and do nothing)
boolean correct = isTrueDate(day, month, year);
if(correct){
this.day = day;
this.month = month;
this.year = year;
return true;
}else{
goodDate = false;
return false;
}
//return false;
}
public boolean setDate(String aDate){
// If aDate is of the form "dd/mm/yyyy" or "d/mm/yyyy"
// Then set the object to this date and return true.
// Otherwise, return false (and do nothing)
Date d = new Date(aDate);
boolean correct = isTrueDate(d.day, d.month, d.year);
if(correct){
this.day = d.day;
this.month = d.month;
this.year = d.year;
return true;
}else{
goodDate = false;
return false;
}
}
public String toString(){
// outputs a String of the form "dd/mm/yyyy"
// where dd must be 2 digits (with leading zero if needed)
// mm must be 2 digits (with leading zero if needed)
// yyyy must be 4 digits (with leading zeros if needed)
String day1;
String month1;
String year1;
if(day<10){
day1 = "0" + Integer.toString(this.day);
} else{
day1 = Integer.toString(this.day);
}
if(month<10){
month1 = "0" + Integer.toString(this.month);
} else{
month1 = Integer.toString(this.month);
}
if(year<10){
year1 = "00" + Integer.toString(this.year);
} else{
year1 = Integer.toString(this.year);
}
if(goodDate){
return day1 +"/" +month1 +"/" + year1;
}else{
goodDate = true;
return "Invalid Entry";
}
}
谢谢
答案 0 :(得分:0)
此代码的一个主要问题是您的toString()
函数修改了程序的状态(通过将goodDate
设置为true)。问题是toString可以在代码中的任何地方被调用,即使你没有明确地调用它。所以,我愿意打赌其他人正在调用它并将goodDate
设置为true。看看你是否能找到一种方法使toString()
功能不改变状态。
答案 1 :(得分:0)
在第三方库中更容易做到,Joda-Time 2.3。在实例化新的DateTime实例时,如果将无效值传递给构造函数,则该类会抛出异常。
下面的代码使用Java 7中的新Multi-Catch Exceptions功能。
示例源代码:
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
public class Invoice {
Boolean isDateTimeValid (int year, int month, int day) {
org.joda.time.DateTimeZone losAngelesTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles");
try {
org.joda.time.DateTime dt = new org.joda.time.DateTime(year, month, day, 0, 0, losAngelesTimeZone);
return true; // No exception thrown, so this must be a valid date-time.
} catch (org.joda.time.IllegalFieldValueException e) {
return false; // Oops, invalid values used as input.
} catch ( Exception e) {
System.out.println("ERROR Encountered an unexpected Exception: " + e.getStackTrace() );
return false;
}
}
}
编码任何地方来调用该有效性方法。
Invoice invoice = new Invoice();
System.out.println( "Is valid date for 2013, 11, 15: " + invoice.isDateTimeValid(2013, 11, 15) );
System.out.println( "Is valid date for 2013, 99, 15: " + invoice.isDateTimeValid(2013, 99, 15) );
跑步时......
Is valid date for 2013, 11, 15: true
Is valid date for 2013, 99, 15: false
关于Joda-Time及相关问题......
// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
// http://www.joda.org/joda-time/
// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
// JSR 310 was inspired by Joda-Time but is not directly based on it.
// http://jcp.org/en/jsr/detail?id=310
// By default, Joda-Time produces strings in the standard ISO 8601 format.
// https://en.wikipedia.org/wiki/ISO_8601
// About Daylight Saving Time (DST): https://en.wikipedia.org/wiki/Daylight_saving_time
// Time Zone list: http://joda-time.sourceforge.net/timezones.html