有没有一种方法可以在日期中添加月份以获取以下期望值

时间:2019-05-03 10:08:02

标签: java datetime

在Joda Time本身/或其他一些API中,我是否可以实现相同的机制或方法? 请提出建议?

输入日期:2018-04-30

像这样使用Joda Time的输出为:2018-05-30

预计日期:2018-05-31

再次编辑 想知道是否可以这样说并喜欢

  

如果输入日期是最后日期(将使用共享的算法),则   获取下个月的最后日期,然后

     

否则,如果输入日期为其他日期,则使用plusMonths方法

对吗?

String startDate = "2018-04-30";
DateTime startDateTime = new DateTime(startDate, DateTimeZone.UTC);

int repeatEvery = 1;
int numOfPayments = 2;
String endDate = startDateTime.plusMonths(repeatEvery * (numOfPayments-1)).toString();
System.out.println(endDate);

2 个答案:

答案 0 :(得分:3)

使用Java Time API,使用TemporalAdjuster获取一个月的最后一天非常简单,该API附带了一些已经定义的内容,例如TemporalAdjusters.lastDayOfMonth()

因此,这是一个有关如何获取下个月的最后一天(基于今天)的简单示例。

LocalDate date = LocalDate.now()
    .plus(1, ChronoUnit.MONTHS)
    .with(TemporalAdjusters.lastDayOfMonth()));

我认为这很冗长,可以理解。

将字符串解析为LocalDate。只需将now()替换为parse()即可:

LocalDate.parse("2019-05-03", DateTimeFormatter.ISO_DATE);

使用:

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;

这实际上已经an answer in the duplicate提出,只需要稍作努力就可以找到它。湖泊隐约可见!!

答案 1 :(得分:0)

您可以在日历上执行此操作

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String startDate = "2018-04-30";

    int repeatEvery = 1;
    int numOfPayments = 2;

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(sdf.parse(startDate));
    cal.add(Calendar.MONTH, repeatEvery * (numOfPayments - 1));
    System.out.println("intRes: "+sdf.format(cal.getTime()));

    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

    String endDate = sdf.format(cal.getTime());

    System.out.println(endDate);

退出

intRes:2018-05-30

2018-06-01

我不知道为什么这会给我2018-06-01吗?