解析日期,没有跨越12个月数据的年份

时间:2016-03-16 17:55:22

标签: java date

我有许多项目的日期以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

  1. 抓住日期:01/31
  2. 将当前年份附加到:01/31/2016
  3. 使用日期格式MM/dd/yyyy
  4. 解析日期

    日期解析是在严格模式下执行的,所以像02/29这样的东西不会转到03/01。

    然而,这个算法在闰年失败,因为假设当前年份是2013年,我将尝试解析02/29/2013并且它将失败。

    我可以用什么方法来确定日期年份?

3 个答案:

答案 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)

那么做点什么呢?

  1. 从您的档案中抓取日期。
  2. 追加当年。
  3. 抓住今天的约会。
  4. 将今天的日期与文件的日期进行比较。如果今天的日期在之前,则从文件日期减去一年。
  5. 解析文件日期。