2017-08-06 56 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”))' –