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

问题描述

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

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


       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

谁能帮忙告诉我。

解决方法

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

如果您正在获取 java.util.Date 的对象,请将其转换为 java.time.Instant,然后通过应用所需的区域偏移量从中获取 OffsetDateTime。最后,使用 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,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。

,

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

    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 或更高版本,我强烈建议不要使用过时的类 java.util.Date 并切换到包 java.time。您可以使用 class ZonedDateTime 或其任何“兄弟”,例如 LocalDateTime 或其他。同样使用此包,您可以使用类 DateTimeFormatter 将日期格式化为字符串。也可以很容易地添加或减去任何时间单位的数量(例如天、分钟、月等......通过诸如 plusDays() 之类的方法。

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

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

,

首先不要将您的订单日期保存在字符串中。由于您需要订购时间,请将其保存在 Instant 中。 Instant 是一个独立于时区或 UTC 偏移量的时间点(有人说它在 UTC 中)。当您需要展示时,您始终可以将其格式化为用户时区中的字符串。它与数字和布尔值相同,您不要将它们保存在字符串中(我希望)。

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

第三不要假装 GMT-4:00 是一个时区。这是一个 GMT 偏移量。您的用户可能会在夏令时 (DST) 开始或结束时的任何时候使用不同的 GMT 偏移量,或者政客只是改变他们对属于哪个 GMT 偏移量的想法。因此,请使用适当的时区 ID,如美国/巴巴多斯。格式为地区/城市

所以你的方法变得简单:

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

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

链接

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