Java 基于当前月份的返回值
我使用这段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
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());
以明确您的意图。