2017-08-06 47 views
4

我使用此Java代碼根據月份開始和結束日期獲取價格。根據當月的返回值

public int getPrice() 
    { 
     java.util.Date today = Calendar.getInstance().getTime(); 

     Calendar aumgc = new GregorianCalendar(); 
     aumgc.set(Calendar.AUGUST, 8); 
     aumgc.set(Calendar.DAY_OF_MONTH, 1); 
     java.util.Date augustStart = aumgc.getTime(); 

     Calendar emgc = new GregorianCalendar(); 
     emgc.set(Calendar.AUGUST, 8); 
     emgc.set(Calendar.DAY_OF_MONTH, 31); 
     java.util.Date augustEnd = emgc.getTime(); 

     Calendar sepmgc = new GregorianCalendar(); 
     sepmgc.set(Calendar.SEPTEMBER, 9); 
     sepmgc.set(Calendar.DAY_OF_MONTH, 1); 
     java.util.Date septemberStart = sepmgc.getTime(); 

     Calendar eomgc = new GregorianCalendar(); 
     eomgc.set(Calendar.SEPTEMBER, 9); 
     eomgc.set(Calendar.DAY_OF_MONTH, 31); 
     java.util.Date septemberEnd = eomgc.getTime(); 

     Calendar ocmgc = new GregorianCalendar(); 
     ocmgc.set(Calendar.OCTOBER, 10); 
     ocmgc.set(Calendar.DAY_OF_MONTH, 1); 
     java.util.Date octoberStart = ocmgc.getTime(); 

     Calendar eocmgc = new GregorianCalendar(); 
     eocmgc.set(Calendar.OCTOBER, 10); 
     eocmgc.set(Calendar.DAY_OF_MONTH, 31); 
     java.util.Date octoberEnd = eocmgc.getTime(); 

     if (!(today.before(augustStart) || today.after(augustEnd))) 
     { 
      return 30; 
     } 

     if (!(today.before(septemberStart) || today.after(septemberEnd))) 
     { 
      return 40; 
     } 

     if (!(today.before(octoberStart) || today.after(octoberEnd))) 
     { 
      return 50; 
     } 
     return 0; 

    } 

正如你所看到的,我使用了很多代碼來獲得基於當月的價格。我如何簡化代碼並使用SQL日期?

在JVM中是否有任何已經制定的解決方案?

+0

所以用目前的「當月是八月」=> 30,「月份是七月」=> 4,月份是十月「=> 50? – azro

+1

SQL如何發揮您的問題? –

+0

@azro current - 我想要這個結果。 –

回答

5

我會建議使用最新的API LocalDateTime從Java 8做這個國王的事情,很容易:

import java.time.Month; // Enum use in `switch` statement. 

public int getPrice() { 
    LocalDateTime now = LocalDateTime.now(); // line 2 
    switch (now.getMonth()) {     // line 3 
     case AUGUST: 
      return 30; 
     case SEPTEMBER: 
      return 40; 
     case OCTOBER: 
      return 50; 
     default: 
      return 0; 
    } 
} 
// line 2&3 can be reduce in : // switch (LocalDateTime.now().getMonth()){ 

這將返回相同的:

public int getPrice() { 
    return (LocalDateTime.now().getMonthValue() - 8) * 10 + 30; 
} 
//or return (LocalDateTime.now().getMonthValue() - 5) * 10; 
+0

謝謝!我只是驚訝它可以實現的簡單程度。 –

+0

不客氣,考慮接受答案,如果它滿足你;) – azro

+0

好的答案,除了:(A)你應該使用'ZonedDateTime'作爲'LocalDateTime'故意丟棄可能有用的時區信息。 (B)更好地明確指定預期的/期望的時區,而不是隱式地依賴於當前的默認值:'ZonedDateTime.now(ZoneId.of(「Europe/Sofia」))' –