Java,将日期设置为0/0/0

时间:2016-01-13 13:23:23

标签: java date

我有一个带有日期的对象,我想在吸气器中将它们归还。问题是我需要做Date.toString();因为我必须打印它们,当日期为空时我得到NullPointerException

我正考虑在日期为空时返回日期0/0/0,但我不知道如何设置此值。有什么办法吗?就像new Date(0)返回 1970-01-01-00:00:00 一样,是否有类似的东西但是要返回0/0/0?

谢谢!

5 个答案:

答案 0 :(得分:10)

根据定义,没有Date 0/0/0,因为没有Day 0而没有Month 0.一天是集合{1,..,28或30或31}的成员,月份是集合{1,... 12}的成员。因此,将0/0/0表示为日期对象是不可能的 - 也是不可能的。

答案 1 :(得分:1)

可怕的DateCalendar类在几年前被 java.time 类取代。

LocalDate

LocalDate类表示没有日期,没有time zoneoffset-from-UTC的仅日期值。

您可以用数字设置月份,一月至十二月的理智编号为1-12。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者更好的是,使用预定义的Month枚举对象,每年的每个月使用一个。提示:在整个代码库中使用这些Month对象,而不是仅使用整数,可以使您的代码更具自记录性,确保有效值并提供type-safetyYearYearMonth的同上。

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

零日期毫无意义

  

除了返回0/0/0之外,还有什么与此类似的东西吗?

否。

尝试用全零的日期表示null是错误的方法。日期全为零(年,月和日均为零)是没有的。

相反,选择一个任意日期作为特殊值。彻底记录您的选择及其含义。

请勿选择时间上相距太远的日期。许多库和数据库的值范围受到限制。您不希望数据在那里中断。

通常,我建议使用1970-01-01T00:00:00Z的纪元,即1970年UTC的第一时刻(Z表示UTC,并发音为“ Zulu”)。此刻用作epoch referenceUnix,与Java捆绑在一起的旧日期时间类,以及内置在Java 8及更高版本中的现代日期时间类。因此,许多程序员和系统管理员会意识到这一刻很特别。为了方便起见, java.time 类包含一个常量:Instant.EPOCH

很明显,我的建议适用于对前瞻性临近日期感兴趣的常见商业应用程序,过去的历史不能追溯到1970年。如果这不能满足您的需求,请选择另一个任意值,例如1900-01-01 。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

Java使用没有0年的公历。此外,你必须记住,现在也有零月。将月份设置为' 0'因为月份是基于0指数,所以会导致1月份。零日也不存在。 假设你正在回归"现代"日期(AD),你可以设置你的"下限"在BC时代约会。因此,当您获得 null 日期时,您可以返回BC日期以将其与实际日期区分开来。这是代码:

Calendar cal = Calendar.getInstance();    
cal.set(Calendar.ERA, GregorianCalendar.BC); //Set the BC era
cal.set(Calendar.YEAR, 1); //Set the year to 1 BC
cal.set(Calendar.MONTH, 0); //Set the month to January
cal.set(Calendar.DAY_OF_MONTH, 1); //Set the day to 1st
DateFormat df = new SimpleDateFormat("yyyy MMM d G"); //Format the date
String returnedDate = df.format(cal.getTime()); //Generate a String of it for other use

如果您还要从BC时代获得日期(也许可以设置更旧的日期),您可以根据需要自定义代码。

编辑:当然你可以使用其他人建议的内容,即检查null并返回"0/0/0"字符串,但这可能会在以后引起更多问题,当你试图解析前面提到的字符串。此外,由于定义0/0/0不是公历中的有效日期(参见说明),因此您应该避免使用这个"通配符"字符串并设置实际日期,如上所述。

澄清:阳历不包含0年,0月或0天按定义,而不是Java中的实现(意思是'这不是故意限制,而是其概念的一部分。)

答案 3 :(得分:0)

我的解决方案是使用EPOCH日期作为LocalDate.ofEpochDay()的基础来创建LocalDate常数。而且我没有返回空日期(that does not exist),而是根据评估的情况返回了LocalDate对象。然后,根据我在域中获取的getBirthdate方法,我会做些事情。

常量的定义

public class LocalDateUtils {

    public static final LocalDate EMPTY_FIELDS = createLocalDate(0);
    public static final LocalDate EMPTY_FIELD_DAY_OF_MONTH = createLocalDate(1);
    public static final LocalDate EMPTY_FIELD_MONTH = createLocalDate(2);
    public static final LocalDate EMPTY_FIELD_YEAR = createLocalDate(3);

    /**
     * Purpose: Create a date with @param epochDay days added
     * Observation: EPOCH (1970-01-01)
     */
    private static LocalDate createLocalDate(long epochDay) {
        return LocalDate.ofEpochDay(epochDay);
    }
}

实施

/**
 * Purpose: Describe a birthday or a constant indicating empty field (s).
 * Observation: According to if the parameters are zeros.
 */
LocalDate getBirthdate(int year,
                       int month,
                       int dayOfMonth) {
    if (dayOfMonth == 0 && month == 0 && year == 0)
        return LocalDateUtils.EMPTY_FIELDS;
    if (dayOfMonth == 0)
        return LocalDateUtils.EMPTY_FIELD_DAY_OF_MONTH;
    if (month == 0)
        return LocalDateUtils.EMPTY_FIELD_MONTH;
    if (year == 0)
        return LocalDateUtils.EMPTY_FIELD_YEAR;
    return LocalDate.of(year, month, dayOfMonth);
}

用法

    if (getBirthdate() == LocalDateUtils.EMPTY_FIELDS) {
    }

    if (getBirthdate() == LocalDateUtils.EMPTY_FIELD_DAY_OF_MONTH) {
    }

    if (getBirthdate() == LocalDateUtils.EMPTY_FIELD_MONTH) {
    }

    if (getBirthdate() == LocalDateUtils.EMPTY_FIELD_YEAR) {
    }

Source

GL

答案 4 :(得分:-1)

这个简单的方法可以满足您的需求,正如您在问题的评论中已经提到的那样:

public String dateString(Date date) {   
    if (date != null)
        return date.toString();
    else
        return "0/0/0";
}

String dateString;
try {
    dateString = date.toString();
}
catch(NullPointerException e) {
    dateString = "0/0/0";
}

更新:不鼓励第二种选择,如评论中所示。