我正在尝试创建一个没有年份的日期对象,因为它不适用(它代表一年中的某个时间而不是特定的年份)。
我想尽可能使用实际的Date类,因为我的框架有一个自动HTTP绑定。
没有构造函数可以执行此操作。
答案 0 :(得分:3)
目前尚不清楚“自动HTTP绑定”的含义 - 在什么情况下?这个价值如何传达?
您可以使用任意年份创建Date
- 例如,2012年会很好,因为这将支持2月29日。但是,无论使用,另一端的数据都需要知道忽略年份部分。 (当然,您应该首先使用Calendar
来创建年份,因为Date
构造函数已经过去了年/月/日等。
无论你做什么,Date
都代表了一个时刻 - 没有一年的Date
没有概念,只有没有一小时的Date
。这是一瞬间,就是这样。它没有关联的时区,日历或格式字符串,或者哪些位有用的任何概念。使用它的代码需要处理它。
我个人建议使用Joda Time来处理Java中的所有日期/时间。它实际上并没有我所能看到的MonthDay类型(这是你想要的),但你可以使用LocalDate
并忽略年份。或者你可以自己实现ReadablePartial
,但那会更有效:)
答案 1 :(得分:3)
您还可以使用一个构造函数扩展Date
类,其中包含month
和day
的两个参数,您可以像使用Date
一样使用它你的框架。
以下示例将为您提供2012年的Date
,其中包括2月29日:
public class MyDate extends Date {
static private final long START = 1325286000000L; // Dec 31st, 2011
static private final long ONE_DAY = 24 * 60 * 60 * 1000;
static private final int[] DAYS = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
public MyDate(int month, int day) {
super(START + (DAYS[month - 1] + day) * ONE_DAY);
}
}
答案 2 :(得分:1)
在这种情况下,您可以忽略年份字段。因为你只想使用Date
,默认情况下如果你没有; t覆盖它会保留当前年份
答案 3 :(得分:1)
假设您真的不关心任何日期逻辑或验证,请执行以下操作:
public class YearlessDate{
private int month;
private int day;
}
答案 4 :(得分:1)
有些库可以实现部分日期,它们可以完全按照您的意愿行事。例如,joda的Partial。
答案 5 :(得分:1)
您还可以查看ThreeTen项目:
http://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTen
它提供了MonthDay类:
ThreeTen是JSR 310的参考实现:日期和时间API
http://jcp.org/en/jsr/summary?id=310
目前计划包含在Java SE 8中: