java-如何检查日期对象是否等于昨天?
现在我正在使用此代码
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am"
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime()))) //getDateFromLine() returns a Date Object that is always at 12pm
{...CODE
必须有一种更平滑的方法来检查getdateFromLine()返回的日期是否为昨天的日期。 仅日期重要,时间不重要。 这就是为什么我使用SimpleDateFormat。谢谢您的帮助!
8个解决方案
76 votes
Calendar c1 = Calendar.getInstance(); // today
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday
Calendar c2 = Calendar.getInstance();
c2.setTime(getDateFromLine(line)); // your date
if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
&& c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {
这也适用于1月1日这样的日期。
Andrei Fierbinteanu answered 2020-07-18T09:07:30Z
17 votes
java.time
使用Java 8中内置的java.time框架
LocalDate now = LocalDate.now(); //2015-11-24
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23
yesterday.equals(now); //false
yesterday.equals(yesterday); //true
官方Oracle LocalDate教程状态
equals方法应用于比较。
如果您正在使用LocalDate、LocalDate或LocalDate之类的对象,则可以转换为LocalDate。
LocalDateTime.now().toLocalDate(); # 2015-11-24
Przemek answered 2020-07-18T09:08:08Z
14 votes
我同意Ash Kim的观点,如果您想保持理智,可以使用Joda-Time库。
import org.joda.time.DateTime;
public static boolean dayIsYesterday(DateTime day) {
DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1);
DateTime inputDay = day.withTimeAtStartOfDay();
return inputDay.isEqual(yesterday);
}
在此示例中,如果DateTime day来自昨天,则dayIsYesterday(day)将返回true。
plowman answered 2020-07-18T09:08:32Z
8 votes
避免使用java.util.Date和.Calendar
可接受的答案在技术上是正确的,但并非最佳。 众所周知,java.util.Date和.Calendar类很麻烦。 避免他们。 使用Joda-Time或新的java.time包(在Java 8中)。
时区
时区在日期时间工作中至关重要。 如果您忽略此问题,则将应用JVM的默认时区。 更好的做法是始终指定而不是依赖默认值。 即使您想要默认值,也要显式调用getDefault。
一天的开始由时区定义。 柏林比蒙特利尔早到了新的一天。 因此,“今天”和“昨天”的定义需要一个时区。
乔达时代
Joda-Time 2.3中的示例代码。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTime today = DateTime.now( timeZone );
确定昨天的一种方法是转换为LocalDate对象。 此处显示的另一种方法是将“昨天”表示为时间跨度。 我们将跨度定义为从昨天的第一刻到今天的第一刻,但不包括今天的第一刻。 这种方法称为“半开放式”,其中开始是包含在内的,结尾是排斥的。
减去一天直到昨天(或前一天)。
DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );
将目标java.util.Date对象转换为Joda-Time DateTime对象。 将时区应用于该新对象,而不是依赖于应用JVM的默认时区。 从技术上讲,此处的时区是无关紧要的,但包括时区是一个好习惯。
DateTime target = new DateTime( myJUDate, timeZone );
测试目标是否在昨天的间隔内降落。
boolean isYesterday = yesterdayInterval.contains( target );
显然,这种具有半开放时间跨度的方法不仅仅适用于“昨天”,例如“本周”,“上个月”等等。
更新:Joda-Time项目现在处于维护模式。 该团队建议迁移到java.time类。 请参见Przemek的正确答案中的java.time解决方案。
Basil Bourque answered 2020-07-18T09:09:46Z
2 votes
代替设置日历,请尝试以下操作:
public static void main(String[] args) {
int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS);
String currDate = dateFormat.format(date.getTime());
String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS);
System.out.println("Previous date: " + prevDate);
System.out.println("Current date: " + currDate);
System.out.println("Next date: " + nextDate);
}
这应该使您可以沿日历前后移动
然后,您可以简单地将getDateFromLine(line)与prevDate值或任何您喜欢的值进行比较。
gruntled answered 2020-07-18T09:10:15Z
1 votes
我建议您考虑使用Joda-Time。 它比JDK产品更好。
chickeninabiscuit answered 2020-07-18T09:10:35Z
0 votes
使用这种方法测试此方法时,我感到有些困惑
Calendar now = new GregorianCalendar(2000, 1, 1);
now.add(Calendar.DATE, -1);
SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
System.out.println(format.format(now.getTime()));
我的期望是打印1999-12-31,但实际是2001-1-31我猜Calendar.add()只处理一个月中的某天。
但是实际的错误是我创建Calendar对象的方式。在Calendar中,月份从0开始,变量的值现在是2001-2-1,我很自以为是不打印它。当我发现有问题时。创建日历的正确方法是:
Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1);
日历对于前C#程序员来说太奇怪了:(
Allen answered 2020-07-18T09:11:08Z
0 votes
大概是这样的:
Calendar c1 = Calendar.getInstance();
Date d1 = new Date(/* control time */);
c1.setTime(d1);
//current date
Calendar c2 = Calendar.getInstance();
int day1=c1.get(Calendar.DAY_OF_YEAR);
int day2=c2.get(Calendar.DAY_OF_YEAR);
//day2==day1+1
Inv3r53 answered 2020-07-18T09:11:28Z