我有一个带有日期的对象,我想在吸气器中将它们归还。问题是我需要做Date.toString();
因为我必须打印它们,当日期为空时我得到NullPointerException
。
我正考虑在日期为空时返回日期0/0/0,但我不知道如何设置此值。有什么办法吗?就像new Date(0)
返回 1970-01-01-00:00:00 一样,是否有类似的东西但是要返回0/0/0?
谢谢!
答案 0 :(得分:10)
根据定义,没有Date 0/0/0,因为没有Day 0而没有Month 0.一天是集合{1,..,28或30或31}的成员,月份是集合{1,... 12}的成员。因此,将0/0/0表示为日期对象是不可能的 - 也是不可能的。
答案 1 :(得分:1)
可怕的Date
和Calendar
类在几年前被 java.time 类取代。
LocalDate
LocalDate
类表示没有日期,没有time zone或offset-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-safety。 Year
和YearMonth
的同上。
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
除了返回0/0/0之外,还有什么与此类似的东西吗?
否。
尝试用全零的日期表示null
是错误的方法。日期全为零(年,月和日均为零)是没有的。
相反,选择一个任意日期作为特殊值。彻底记录您的选择及其含义。
请勿选择时间上相距太远的日期。许多库和数据库的值范围受到限制。您不希望数据在那里中断。
通常,我建议使用1970-01-01T00:00:00Z的纪元,即1970年UTC的第一时刻(Z
表示UTC,并发音为“ Zulu”)。此刻用作epoch reference的Unix,与Java捆绑在一起的旧日期时间类,以及内置在Java 8及更高版本中的现代日期时间类。因此,许多程序员和系统管理员会意识到这一刻很特别。为了方便起见, java.time 类包含一个常量:Instant.EPOCH
。
很明显,我的建议适用于对前瞻性临近日期感兴趣的常见商业应用程序,过去的历史不能追溯到1970年。如果这不能满足您的需求,请选择另一个任意值,例如1900-01-01 。
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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) {
}
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";
}
更新:不鼓励第二种选择,如评论中所示。