如何在java中获取以前的日期

时间:2010-03-16 20:52:26

标签: java date

我有一个格式为 yyyyMMdd 的字符串对象。有一种简单的方法可以获得具有相同格式的上一个日期的字符串吗? 感谢

10 个答案:

答案 0 :(得分:15)

以下是如何做到没有 Joda时间:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Main {

    public static String previousDateString(String dateString) 
            throws ParseException {
        // Create a date formatter using your format string
        DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

        // Parse the given date string into a Date object.
        // Note: This can throw a ParseException.
        Date myDate = dateFormat.parse(dateString);

        // Use the Calendar class to subtract one day
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(myDate);
        calendar.add(Calendar.DAY_OF_YEAR, -1);

        // Use the date formatter to produce a formatted date string
        Date previousDate = calendar.getTime();
        String result = dateFormat.format(previousDate);

        return result;
    }

    public static void main(String[] args) {
        String dateString = "20100316";

        try {
            // This will print 20100315
            System.out.println(previousDateString(dateString));
        } catch (ParseException e) {
            System.out.println("Invalid date string");
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:13)

我会稍微改写这些答案。

您可以使用

        DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

        // Get a Date object from the date string
        Date myDate = dateFormat.parse(dateString);

        // this calculation may skip a day (Standard-to-Daylight switch)...
        //oneDayBefore = new Date(myDate.getTime() - (24 * 3600000));

        // if the Date->time xform always places the time as YYYYMMDD 00:00:00
        //   this will be safer.
        oneDayBefore = new Date(myDate.getTime() - 2);

        String result = dateFormat.format(oneDayBefore);

获得与使用Calendar计算的结果相同的结果。

答案 2 :(得分:10)

您可以使用:

    Calendar cal  = Calendar.getInstance();
    //subtracting a day
    cal.add(Calendar.DATE, -1);

    SimpleDateFormat s = new SimpleDateFormat("yyyyMMdd");
    String result = s.format(new Date(cal.getTimeInMillis()));

答案 3 :(得分:5)

如果没有库支持,它比Java应该更难。

您可以使用SimpleDateFormat类的实例将给定的String解析为Date对象。

然后您可以使用日历的add()减去一天。

然后你可以使用SimpleDateFormat的format() to将格式化日期作为字符串。

Joda Time library更简单的API。

答案 4 :(得分:4)

使用SimpleDateFormat将String解析为Date,然后减去一天。之后再将日期转换为String。

答案 5 :(得分:3)

这是一个老问题,大多数现有答案早于Java8。因此,请为Java 8+用户添加此答案。


Java 8引入了DateTime的新API,以取代设计不良且难以使用的java.util.Datejava.util.Calendar类。

要处理没有时区的日期,可以使用LocalDate类。

String dateString = "20200301";

// BASIC_ISO_DATE is "YYYYMMDD"
// See below link to docs for details
LocalDate date = LocalDate.parse(dateString, DateTimeFormatter.BASIC_ISO_DATE);

// get date for previous day
LocalDate previousDate = date.minusDays(1);

System.out.println(previousDate.format(DateTimeFormatter.BASIC_ISO_DATE));
// prints 20200229

文档:

答案 6 :(得分:2)

HI,

我想提前20天,到现在的日期,

 Calendar cal = Calendar.getInstance();
    Calendar xdate = (Calendar)cal.clone();
xdate.set(Calendar.DAY_OF_YEAR, - 20);

System.out.println(" Current Time "+ cal.getTime().toString());
System.out.println(" X Time "+ xdate.getTime().toString());

我有一些联合国预期的结果,当我在1月11日尝试时,

当前时间1月11日星期二12:32:16 IST 2011  X Time Sat Dec 11 12:32:16 IST 2010

Calendar cal = Calendar.getInstance();
Calendar xdate = (Calendar)cal.clone();
xdate.set(Calendar.DAY_OF_YEAR,cal.getTime().getDate() - 20 );

System.out.println(" Current Time "+ cal.getTime().toString());
System.out.println(" X Time "+ xdate.getTime().toString());

此代码解决了我的问题。

答案 7 :(得分:0)

如果您愿意使用第三方实用程序Joda-Time,这里有一些使用Java 7上的Joda-Time 2.3的示例代码。只需要两行。

String dateAsString = "20130101";
org.joda.time.LocalDate someDay =  org.joda.time.LocalDate.parse(dateAsString, org.joda.time.format.DateTimeFormat.forPattern("yyyymmdd"));
org.joda.time.LocalDate dayBefore = someDay.minusDays(1);

查看结果:

System.out.println("someDay: " + someDay );
System.out.println("dayBefore: " + dayBefore );

运行时:

someDay: 2013-01-01
dayBefore: 2012-12-31

此代码假定您没有时区。缺少时区很少是好事,但如果是这种情况,那么该代码可能对您有用。如果您有时区,请使用DateTime对象而不是LocalDate

关于该示例代码和关于Joda-Time ......

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
// http://www.joda.org/joda-time/

// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
// JSR 310 was inspired by Joda-Time but is not directly based on it.
// http://jcp.org/en/jsr/detail?id=310

// By default, Joda-Time produces strings in the standard ISO 8601 format.
// https://en.wikipedia.org/wiki/ISO_8601

答案 8 :(得分:0)

您可以创建一个采用

的通用方法
   - Date (String)  (current date or from date),
   - Format (String) (your desired fromat) and
   - Days (number of days before(-ve value) or after(+ve value))

作为输入,并以所需格式返回您想要的日期。

以下方法可以解决此问题。

public String getRequiredDate(String date , String format ,int days){
        try{
         final Calendar cal = Calendar.getInstance();
            cal.setTime(new SimpleDateFormat(format).parse(date));
            cal.add(Calendar.DATE, days);
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            date = sdf.format(cal.getTime());
        }
        catch(Exception ex){
            logger.error(ex.getMessage(), ex);
        }
        return date;
    }
}

答案 9 :(得分:-1)

Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.YEAR, -1);
Date dt2 = new Date(cal2.getTimeInMillis());
System.out.println(dt2);