我有一个格式为 yyyyMMdd 的字符串对象。有一种简单的方法可以获得具有相同格式的上一个日期的字符串吗? 感谢
答案 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引入了Date
和Time
的新API,以取代设计不良且难以使用的java.util.Date
和java.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);