Java 基于当前月份的返回值

Java 基于当前月份的返回值,java,Java,我使用这段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_MONT

我使用这段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 date


有没有已经在JVM中实现的解决方案?

我建议使用Java 8中最新的API LocalDateTime来轻松完成这项任务:

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;

因此,利用当前时刻:“月份是8月”=>30日,“月份是9月”=>4日,月份是10月”=>50日?SQL是如何处理您的问题的?@azro current-我想要这个结果。谢谢!我只是惊讶于它能实现得多么简单。不客气,如果您满意,请考虑接受答案;)回答得好,除了:(A)您应该使用
ZoneDateTime
作为
LocalDateTime
故意丢弃可能有用的时区信息。(B)最好明确指定预期/期望的时区,而不是隐式依赖当前默认值:
ZoneDateTime.now(ZoneId.of(“Europe/Sofia”))
@BasilBourque你能粘贴完整的答案吗?@PeterPenzov azro的代码已经是正确和完整的。我想把这一行代码
LocalDateTime now=LocalDateTime.now();
换成
ZonedDateTime now=ZonedDateTime.now(ZoneId.of(“欧洲/索菲亚”);
在这种情况下你会得到同样的结果(取决于您的默认时区),但会使代码更合理,因为无需故意放弃时区信息。如果确实要使用当前默认时区,请使用:
ZonedDateTime now=ZonedDateTime.now(ZoneId.systemDefault());
以明确您的意图。