我有许多项目的日期以MM/dd
格式指定,没有指定年份。
但是,从数据的上下文暗示这一年,因为数据显示的日期不超过“当前日期”(在数据中指定)的12个月
例如,假设当前日期是2013年1月31日。 这意味着将提供2012年2月1日至2013年1月31日(包括首尾两天)的信息。
我面临的问题是,因为数据中没有指定年份,所以在将数据加载到数据库之前,我需要自己生成这些年份。
从数据的上下文来看,我们知道任何大于当前月份的日期都是上一年,而任何小于或等于当月的日期都是当前年份。
因此假设当前日期是2013年1月,我们有类似
的内容01/31 - 2013
01/01 - 2013
12/31 - 2012
02/29 - 2012
现在,这里的问题是最后一行的日期。
2012年是闰年,所以2月29日确实存在。 但是,2013年不是。
我目前的日期解析方法如下(使用SimpleDateFormat
)
MM/dd/yyyy
日期解析是在严格模式下执行的,所以像02/29这样的东西不会转到03/01。
然而,这个算法在闰年失败,因为假设当前年份是2013年,我将尝试解析02/29/2013
并且它将失败。
我可以用什么方法来确定日期年份?
答案 0 :(得分:3)
将日/月解析为java.time.MonthDay
,将其与MonthDay.now()
进行比较,并使用正确的年份(例如,使用atYear
)调用Year.now()
,具体取决于结果。
您可能还想考虑time zones。
应用于您的示例的简单版本,假设输入格式正确并忽略时区问题,可能如下所示:
public static void main(String[] args) {
m("01/31", YearMonth.of(2013, 1));
m("01/01", YearMonth.of(2013, 1));
m("12/31", YearMonth.of(2013, 1));
m("02/29", YearMonth.of(2013, 1));
}
private static void m(String date, YearMonth currentMonth) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MM/dd");
MonthDay md = MonthDay.parse(date, fmt);
int year = currentMonth.getYear();
MonthDay cutoffDate = MonthDay.from(currentMonth.atEndOfMonth());
if (md.isAfter(cutoffDate)) year--;
LocalDate result = md.atYear(year);
System.out.println(date + " - " + year + " ==> " + result);
}
输出:
01/31 - 2013 ==> 2013年1月31日
01/01 - 2013 ==> 2013-01-01
12/31 - 2012 ==> 2012-12-31
02/29 - 2012 ==> 2012-02-29
答案 1 :(得分:2)
你不能按照你想要的方式去做。您需要确定从将整个事物放入Date
之前的月份和日期开始的年份。这里有一些假代码,假设日期总是在上一年之内,而今天的日期等于今天而不是1年前(根据需要调整):
int cy = current year
int cm = current month
int cd = current day of month
int im = input month
int id = input day of month
int year = (im < cm || im==cm && id <= cd) ? cy : cy-1
try
Date d = new Date(year, im, id) strict
catch
invalid date
答案 2 :(得分:1)
那么做点什么呢?