如何将空String值传递给Java中的Date字段

时间:2017-02-15 19:20:25

标签: java

我在当前的java程序中有一个场景,如果用户在excel Date字段中输入某个日期(01/01/1900),我应该标记该日期并清除数据库中的值。在这种情况下,由于该字段是Date类型,我需要将它传递给xml作为""即空字符串,因为我不能传递null。我收到错误是因为它期待格式为" yyyy-MM-dd"传递给xml而不是""。当然,当将Date字段设置为某个值时,我不能在setVesselDate()方法中传递一个空字符串,因为它会抱怨说它必须是如此格式化。我有一个方法来验证返回sql Date值的日期(handleValidateDate)。

任何建议将日期字段实际设置为""会有所帮助。以下是我的代码:

if (vesselAssignmentObj.getVesselDate().length() > 0) 
{
    String clearOutDateFlag = "1900-01-01";
    String clearField = "";
    //below returns a dateformat of yyyy-MM-dd at i
    vesselDate = handleValidateDate(vesselAssignmentObj.getVesselDate(), VESSEL_ASSIGNMENTS_VESSEL, i);

    if (vesselDate.toString().equals(clearOutDateFlag))
    {
        vesselAssignmentObj.setVesselDate(String.valueOf(vesselDate.toString().equals(clearField)));
    }
    else
    {
        vesselAssignmentObj.setVesselDate(String.valueOf(vesselDate).toString());
    }
}

1 个答案:

答案 0 :(得分:0)

不容易回答。

  

...我应该标记并清除数据库中的值...

任何指示你的人都应该定义什么"清除价值"装置

NULL

通常在数据库中清除价值"可能意味着使用NULL值。但是空值会带来a bag of hurt,从而引起含义的模糊,以各种方式影响排序和查询,以及在您的应用和库中进行分支。

虽然我通常会像瘟疫一样避免使用NULL(考虑Dr. Chris Date的建议),但事实上这可能是最符合您需求的。

任意日期为标志

您可以选择一个任意日期作为标记,表示“空”'或者未指定'或者'未知'。但是约会?一位评论者建议0000-00-00,但此值可能超出某些数据库的日期数据类型的限制。此外,由于不同的日历系统处理该时期的含义,因此零年左右的日期可能会有问题。此外,在西方采用Gregorian calendar之前的任何日期都是有问题的,因为我们在从Julian calendar过渡到格里高利时失去了一些日子。

1901-01-01

在评论中,您说商业规则要求日期超过1900年。在这种情况下,我会选择1901-01-01作为我的国旗日期。诀窍是让整个团队和后代都清楚这一点。确保在编程中使用命名良好的常量,并在应用程序和数据库中很好地记录。

1970-01-01

任意日期标志的另一个常见选择是1970年的第一个1970-01-01。该日期是epoch reference date和java.time中使用的常用Unix time。这使得特定日期对于信息交易中的许多人来说是可识别的。但是你仍然需要彻底记录,因为这个纪元日期远非唯一的:至少有couple dozen other epoch dates被广泛使用。

千年

另一种选择可能是新千年的日期。不幸的是,这个短语在2000年或2001年意味着不同的人不同的日期。

Postgres数据库使用2000-01-01作为其纪元。 Apple Cocoa框架(可能是世界上分布最广的软件)使用2001-01-01

使用对象,而不是字符串

您不应该在数据库中传递字符串。改为使用对象。 JDBC driver的工作是在Java数据类型和数据库类型之间进行调解。

符合JDBC 4.2及更高版本的驱动程序应该能够通过PreparedStatement::setObjectResultSet::getObject使用java.time类型。如果没有,请回退至简要使用java.sql类型并立即转换为java.time类型。要转换,请查看添加到旧类的新方法。

所有这些JDBC日期时间内容已经被多次覆盖,因此请搜索Stack Overflow以获取更多信息。搜索班级名称InstantZonedDateTimeZoneId