在Java中,如何将空字符串值传递给日期字段

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

我在当前java程序中有一个场景,如果用户在excel日期字段中输入某个日期(01/01/1900),我应该标记该日期并在数据库中清除该值。在本例中,由于字段是日期类型,我需要将其作为“”传递给xml,即空字符串,因为我不能只传递null。我收到一个错误,因为它希望传递到xml的格式是“yyyy-MM-dd”,而不是“”。当然,当将日期字段设置为某个值时,我不能只在setVesselDate()方法中传递一个空字符串,因为它会抱怨说它必须是so格式。我有一个方法验证返回sql日期值的日期(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());
    }
}
没有简单的答案

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

无论是谁指示您,都应该定义“清除值”的含义

无效的 通常在数据库中,“清除值”可能意味着使用一个值。但是空值会带来歧义,以各种方式影响排序和查询,并在应用程序和库中产生影响

虽然我通常会避免像瘟疫一样的空值(接受医生的建议),但实际上这可能最适合您的需要

任意日期作为标志 您可以选择任意日期用作表示“空”或“未指定”或“未知”的标志。但是什么日期?一位评论者建议
0000-00-00
,但该值可能超过某些数据库日期数据类型的限制。此外,由于不同的日历系统如何处理该时期的含义,零年前后的日期可能会有问题。此外,在西方采用公历之前的任何日期都是有问题的,因为我们在从公历过渡到公历的过程中损失了几天

1901-01-01
您在评论中说,业务规则要求日期必须在1900年以上。在这种情况下,我会选择
1901-01-01
作为我的国旗日期。诀窍在于让整个团队和子孙后代明白这一点。确保在编程中使用命名良好的常量,并在应用程序和数据库中记录良好

1970-01-01
任意日期标志的另一个常见选择是1970年的第一个,
1970-01-01
。该日期是java.time中常用的日期。这使得信息行业的许多人都能认出那个特定的日期。但您仍然需要完整地记录,因为这个纪元远不是唯一的一个:至少一个纪元已经被广泛使用

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

Postgres数据库使用
2000-01-01
作为其时代。苹果框架,可能是世界上分布最广的软件,使用的是
2001-01-01

使用对象,而不是字符串 您不应该向数据库传递字符串或从数据库传递字符串。改用对象。您的工作是在Java数据类型和数据库类型之间进行调解

符合JDBC 4.2及更高版本的驱动程序应该能够通过
PreparedStatement::setObject
ResultSet::getObject
使用类型。如果没有,请暂时回到使用类型,并立即转换为类型或从类型转换为类型。要转换,请查看添加到旧类的新方法


所有这些JDBC日期时间的内容已经被讨论了很多次,所以搜索堆栈溢出以获取更多信息。搜索类名
Instant
zoneDateTime
ZoneId

尝试将日期的值设置为0000-00-00,这通常是有效的(在这种情况下从未尝试过,但在其他任何地方它都对我有效)。@AlonAlexander啊,如果有的话。我的程序(不是我创建的,而是继承的)必须进行检查,以确保它超过1900年……奇怪但正确。这是否意味着您真的需要设置日期(我问,因为将它设置为
null
没有什么大不了的)?如果是这样,您将无法将其设置为空字符串。一个可能的解决方法是在遥远的将来设置日期,但这不是我的建议。@peech相反,在数据库中将值设置为NULL是非常重要的。空值会引起值是否丢失或故意为空的歧义。空值影响排序和查询。空值在应用程序和各种库中都有影响。