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

6qftjkof  于 2021-06-26  发布在  Java
关注(0)|答案(4)|浏览(458)

为了我的需要,我必须更新日期到第二天,因为我有目前的日期
我用来获取当前日期的方法

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

有人能帮忙让我知道吗。

tcbh2hod

tcbh2hod1#

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

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());
}
a1o7rhls

a1o7rhls2#

首先,不要把你的订单日期放在一个字符串中。既然你想订时间,就把它放在 Instant . 一 Instant 是一个独立于时区或utc偏移的时间点(有人说是utc)。您可以随时格式化成一个字符串在用户的时区稍后当您需要它的表现。它和数字和布尔值一样,你不能把它们保存在字符串中(我希望如此)。
其次,使用java.time进行日期和时间工作。这个 Instant 我提到的类属于java.time。
第三,不要假装gmt-4:00是时区。这是格林威治时间的偏移量。您的用户可能会在夏季时间(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教程:date time解释如何使用java.time。

wrrgggsh

wrrgggsh3#

首先,如果您使用Java8或更高版本,我强烈建议不要使用过时的类 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
kpbpu008

kpbpu0084#

api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。
出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
如果你得到一个 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, 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。

相关问题