【问题标题】:How add 30 days in current date? [duplicate]如何在当前日期添加 30 天? [复制]
【发布时间】:2019-10-19 19:11:34
【问题描述】:

我想在当前日期添加 30 天,我搜索了很多但没有得到正确的解决方案。

我的代码

 Date date = new Date();
 SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd");
 Calendar c1 = Calendar.getInstance();
 String currentdate = df.format(date);

 try {
     c1.setTime(df.parse(currentdate));
     c1.add(Calendar.DATE, 30);
     df = new SimpleDateFormat("yyyy-MM-dd");
     Date resultdate = new Date(c1.getTimeInMillis());
     String dueudate = df.format(resultdate);
     Toast.makeText(this, dueudate, Toast.LENGTH_SHORT).show();
 } catch (ParseException e) {
     e.printStackTrace();
 }

这段代码的输出是: 2019-01-29 我不明白为什么它显示这个输出任何人都可以帮助我。

【问题讨论】:

  • 为什么要创建一个新的Date 对象和一个新的Calendar 对象? Calendar.getInstance() 将时间设置为当前时间,如果你真的需要Date 对象,你可以在之后调用Calendar#getTime()
  • 发帖前搜索 Stack Overflow。

标签: java android days java.util.calendar


【解决方案1】:

你需要使用

c1.add(Calendar.DAY_OF_YEAR, 30);

而不是

c1.add(Calendar.DATE, 30);

试试这个

    Date date = new Date();
    SimpleDateFormat df  = new SimpleDateFormat("YYYY-MM-dd");
    Calendar c1 = Calendar.getInstance();
    String currentDate = df.format(date);// get current date here

    // now add 30 day in Calendar instance 
    c1.add(Calendar.DAY_OF_YEAR, 30);
    df = new SimpleDateFormat("yyyy-MM-dd");
    Date resultDate = c1.getTime();
    String     dueDate = df.format(resultDate);

    // print the result
    Utils.printLog("DATE_DATE :-> "+currentDate);
    Utils.printLog("DUE_DATE :-> "+dueDate);

输出

2019-06-04 14:43:02.438 E/XXX_XXXX: DATE_DATE :-> 2019-06-04
2019-06-04 14:43:02.438 E/XXX_XXXX: DUE_DATE :-> 2019-07-04

【讨论】:

  • 错了。添加天数时使用DAY_OF_YEARDATE 没有区别。 (这只是关于Calendar 的一个小问题。)
  • 另外,虽然您的代码今天给出了预期的结果,但您的第一个格式模式字符串是错误的,并且会在新年前后给您带来惊喜。
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。进一步适用于ThreeTenABP 中的早期 Android (How to use ThreeTenABP…
【解决方案2】:

另一个更简单的选择,如果在 Java 8 上,使用 java.time 包,它提供了在任何时间单位的当前日期执行加/减的函数,例如:

import java.time.LocalDate;


 LocalDate date =  LocalDate.now().plusDays(30);

 //or
 LocalDate date =  LocalDate.now().plus(30, ChronoUnit.DAYS);

【讨论】:

  • 这是一个很好的答案,谢谢。要在旧版 Android(API 级别低于 26)上使用 LocalDate,请将 ThreeTenABP 添加到您的 Android 项目并确保导入 org.threeten.bp.LocalDate。我建议给now() 提供时区,例如LocalDate.now(ZoneId.of("America/Resolute"))
  • 提示:最好明确指定可选的ZoneId 参数,即使您使用ZoneId.systemDefault,这样读者就知道您考虑了时区的关键问题。
【解决方案3】:

Calendar.getInstance() 为您提供当前时间。您无需为此创建另一个 Date 对象。

    Calendar current = Calendar.getInstance();
    current.add(Calendar.DATE, 30);

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

    Date resultdate = new Date(current.getTimeInMillis());
    String dueudate = df.format(resultdate);

    System.out.println("" + dueudate);

【讨论】:

    【解决方案4】:

    1) 从日期到毫秒。 2)创建一个值为 30L * 24L * 60L * 60L * 1000L 的长变量。 3)将此值添加到您在步骤 1 中获得的毫秒数 4)从这个总和再次回到日期。

    编辑:存储毫秒的变量应该是长的,而不是整数。 Edit2:在每个数字之外添加“L”保证我们不会溢出。

    【讨论】:

    • 存储到 longvariable 是不够的。您的乘法溢出并导致 -1 702 967 296。将其存储到 long 并不能解决这种情况。在任何情况下,都不建议您自己做时间数学,因为它很容易出错。请改用久经考验的库方法。
    猜你喜欢
    • 2017-12-03
    • 2021-03-05
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多