我有一个家谱应用程序,允许您构建节点。我遇到了一个需要编辑成员出生日期的问题。出生日期只是一个字符串,格式如下dd-mm-yyyy。在检查出生日期是否有效时(即任何父母不能比孩子年龄小),我的问题就出现了。因此,如果节点同时具有父节点和子节点,并且用户选择编辑它的出生日期,则该函数必须不断检查以查看是否已添加两个日期之间的年龄。我遇到的问题是使用我定义的方法进行连续检查。我希望有人理解这一点并且可以提供帮助。注意checkDOb也会设置dob。我的命名不好。
这是代码:
private void dateCheck(FamilyMember node) {
String dob = enterDateOfBirth();
if (node.hasChildren()) {
node.setDob(dob);
checkDob(node, node.getOldestChild(), 0);
}
FamilyMember parent = null;
if (node.hasMother() && node.hasFather()) {
if (node.getMother().getAge() > node.getFather().getAge()) {
parent = node.getFather();
} else {
parent = node.getMother();
}
checkDob(parent, node, 1);
} else {
//single parent
if (node.hasMother()) {
parent = node.getMother();
checkDob(parent, node, 1);
}
if (node.hasFather()) {
parent = node.getFather();
checkDob(parent, node, 1);
}
}
}
private void checkDob(FamilyMember parent, FamilyMember child, int member) {
out.println(parent.getYear());
out.println(child.getYear());
while (parent.getYear() > child.getYear()) {
out.println("Invalid Date - The Oldest Child of " + parent.getFullName()
+ "(" + child.getFullName() + ")\n cannot older than his/her parents. Try Again.");
out.println();
if (member == 0) {
parent.setDob(enterDateOfBirth());
}
if (member == 1) {
child.setDob(enterDateOfBirth());
}
}
}
private String enterDateOfBirth() {
out.print("Enter Year Of Birth (0 - 2011): ");
String y = in.nextLine();
out.print("Enter Month Of Birth (1-12): ");
String m = in.nextLine();
if (m.trim().equals("")) {
m = "0";
}
if (m.length() == 1) {
m = "0" + m;
}
m += "-";
out.print("Enter Date of Birth (1-31): ");
String d = in.nextLine();
if (d.trim().equals("")) {
d = "0";
}
if (d.length() == 1) {
d = "0" + d;
}
d += "-";
String dob = d + m + y;
while (!DateValidator.isValid(dob)) {
out.println("Invalid date. Try again.");
dob = enterDateOfBirth();
}
return (dob);
}
提前致谢。
答案 0 :(得分:0)
解析日期的标准方法是使用SimpleDateFormat
。但我不认为这对你的情况有帮助,所以我不会去那里。
但是当你谈论日期时,你应该使用Date对象(或者,正如其他人会说的那样:使用JodaTime的DateTime对象),这会让事情变得更容易。
将Date
类型设为dob
并交换此代码:
String dob = d + m + y;
为此:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.parseInt(y));
cal.set(Calendar.MONTH, Integer.parseInt(m)-1);
cal.set(Calendar.DATE, Integer.parseInt(d));
Date dob = cal.getTime();
(你应该丢失所有的if (m.length() == 1)
内容,因为带有前导零的字符串将被解析为八进制值)
现在您只需验证parentBirthDate.compareTo(childBirthDate)>0
另外,为了更精确,您应该截断小于白天的所有字段:
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
另外:不要使用System.out.println()
,请使用Log4J或SLF4J等日志框架。
哦,顺便说一句,确认孩子比父母年轻还不够。您可能需要验证差异是12年或更长时间: - )
答案 1 :(得分:0)
它可以像smt一样
//return true if one of arguments is true!
private boolean bornBefore(FamilyMember first, FamilyMember second){
if(first == null || second == null){
return true;
}
return /*your magic date comaparator*/;
}
private boolean validDate(FamilyMember node, MagicDate date) {
return bornBefore(node, node.getOldestChild())
&& bornBefore(node.getFather(), node)
&& bornBefore(node.getMother(), node);
}
}
答案 2 :(得分:0)
您应该分离验证和数据输入。首先,您的树模型包含当前值和要输入的新字符串以更改值。
bool checkDOB(String date, FamilyMember node) {
//return true if date is more recent than any parents of node and
//older than any children of node
}
现在你有一个独立的验证方法,你应该在你想要添加一个新节点或编辑一个新节点的时候调用它。在验证之前,请勿更改实际数据模型中的任何值。这意味着您的树将始终处于有效状态,编辑只是本地操作。