2016-03-16 121 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

相關問題