如何使用 java 以当前日期作为输入来获取下一个日期

How to get the next date using java with present date as input

根据我的需要,鉴于我有当前日期,我必须将日期更新到第二天

我用来获取当前日期的方法


       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-4:00"));
        return sdf.format(new Date());

现在我想使用这个作为输入来获取下一个日期 我试过这个

  System.out.println(Integer.parseInt(getOrderDate())+1);

我遇到了这个错误

java.lang.NumberFormatException: For input string: "2020-01-06T09:46:29-0400

谁能帮忙告诉我一下。

您必须添加您设置日期的日期:

    return sdf.format(new Date());

为此,您可以使用如下方法:

public String getOrderDate(Integer daysToAdd) {
    // Date computation
    Calendar c = Calendar.getInstance();
    c.setTime(new Date());
    if(daysToAdd!=null) {
       c.add(Calendar.DATE, daysToAdd);
    }
    // Date formatting
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    sdf.setTimeZone(TimeZone.getTimeZone("GMT-4:00"));
    return sdf.format(c.getTime());
}

首先,如果您使用 java 8 或更高版本,我强烈建议您不要使用过时的 class java.util.Date 并切换到软件包 java.time。您可以使用 class ZonedDateTime 或其任何“兄弟”,例如 LocalDateTime 或其他。此外,对于此软件包,您还可以使用 class DateTimeFormatter to format your date to String. Also there it is easy to add or subtract number of any time units (such as days, minutes, months etc... by such methods as plusDays().

但是,在您的情况下,您需要更改方法 getOrderDate 以接收日期作为参数。您将日期传递给您的方法,然后在那里将其转换为 String。至于在您的日期中添加一天,您可以这样做:

private static final Long ONE_DAY_IN_MILLISECONDS = 24L * 60L * 60L * 1000L 
Date date = new Date(); // current date
date.setTime(date.getTime() + ONE_DAY_IN_MILLISECONDS) // incrementing date by one day

java.util 的日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API.

  • 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它向后移植了大部分 java.time 功能到 Java 6 & 7.
  • 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring and

如果您正在获取 java.util.Date 的对象,请将其转换为 java.time.Instant and then get the OffsetDateTime from it by applying the required zone-offset. Finally, use OffsetDateTime#plusDays 以获取添加了所需天数的另一个实例。

演示:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(202, 0, 6, 9, 46, 29);
        System.out.println(getNextDate(calendar.getTime()));
    }

    public static OffsetDateTime getNextDate(Date date) {
        return date.toInstant().atOffset(ZoneOffset.of("-04:00")).plusDays(1);
    }
}

输出:

0202-01-07T05:46:29.946-04:00

Trail: Date Time.

了解现代日期时间 API

首先不要将您的订单日期保存在字符串中。既然你想要订单时间,就把它放在一个 Instant 中。 Instant 是一个独立于时区或 UTC 偏移量的时间点(有人说它在 UTC 中)。当您需要它进行演示时,您可以随时将其格式化为用户所在时区的字符串。它与数字和布尔值相同,您不要将它们保留在字符串中(我希望)。

第二次使用 java.time 进行日期和时间工作。我提到的Instantclass属于java.time.

第三,不要假装GMT-4:00是时区。这是 GMT 偏移量。您的用户可能会在夏令时 (DST) 开始或结束时的任何时间使用不同的 GMT 偏移量,或者政客们只是改变了他们对属于哪个 GMT 偏移量的想法。因此,请使用适当的时区 ID,例如 America/Barbados。格式为region/city.

所以你的方法变得简单了:

public Instant getOrderDate() {
    return Instant.now();
}

要添加一天 - 获得明天相同的时间 - 您首先需要确定时区,因为在某些时区,一天有时可能长达 23 或 25 小时。我想您想考虑到这一点,而不是盲目地增加 24 小时。例如:

    ZoneId zone = ZoneId.of("Africa/Windhoek");
    ZonedDateTime orderDateTime = getOrderDate().atZone(zone);
    ZonedDateTime tomorrow = orderDateTime.plusDays(1);
    String tomorrowInIso8601Format = tomorrow.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    System.out.println(tomorrowInIso8601Format);

我刚才运行时输出:

2021-01-07T19:01:39.281591+02:00

我正在利用内置格式化程序这一事实。

Link

Oracle tutorial: Date Time 解释如何使用 java.time.