2016-03-16 37 views
3

我有一些项目的日期以MM/dd格式指定,没有指定年份。解析日期,无年数,跨越12个月的数据

然而,今年从数据的上下文暗示,因为数据显示日期,没有从“当前日期”年龄超过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. 抓住日期:1月31日
  2. 追加本年度吧:2016年1月31日
  3. 解析日期使用日期格式MM/dd/yyyy

日期解析是在严格模式下执行的,所以类似02/29的东西不会被翻到03/01。

但是,这种算法在闰年失败,因为假设当前年份是2013年,我将尝试解析02/29/2013,它会失败。

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

+0

您的要求不明确。您将1/31显示为2013年,但2012年1月31日是距离2012年1月1日的当前日期少于12个月。 – JimmyJames

+0

@JimmyJames为了清晰起见,我添加了几天。 – MxyL

回答

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 
+0

这很有道理。我基本上是手动解析日期,而不是依靠日期库来为我做。幸运的是,我不必考虑夏令时或其他常见的与时间相关的情况,所以这并不算太坏。 – MxyL

1

那么,关于做这样的事情:

  1. 从您的文件中获取日期。
  2. 追加当前年份。
  3. 抓住今天的日子。
  4. 将今天的日期与文件的日期进行比较。如果今天的日期在之前,那么从文件日期中减去一年。
  5. 解析文件日期。
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); 
} 

,输出:

1月31日 - 2013 ==> 2013-01-31
01/01 - 2013 ==> 2013-01-01
12/31 - 2012 ==> 2012-12-31
02/29 - 2012 ==> 2012- 02-29

+0

这似乎是Java 8中的一个新类。我没有意识到这一点! – MxyL

+0

的确是新的。 – assylias

+0

你能提供一个如何解析'01/31'到MonthDay的例子吗?我只是尝试'MonthDay.parse(“01/31”)',但它的格式不正确。 – MxyL

相关问题