tzi*_*ppy 44 java calendar date java-time
现在我正在使用此代码
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
Run Code Online (Sandbox Code Playgroud)
必须有一种更平滑的方法来检查getdateFromLine()返回的日期是否是昨天的日期.只有日期很重要,而不是时间.这就是我使用SimpleDateFormat的原因.感谢您的帮助!
And*_*anu 76
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)) {
Run Code Online (Sandbox Code Playgroud)
这也适用于1月1日这样的日期.
Prz*_*mek 17
使用java.time
Java 8内置的框架
LocalDate now = LocalDate.now(); //2015-11-24
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23
yesterday.equals(now); //false
yesterday.equals(yesterday); //true
Run Code Online (Sandbox Code Playgroud)
官方Oracle LocalDate
教程指出
equals方法应该用于比较.
如果你正在使用的对象,如工作LocalDateTime
,ZonedDateTime
或者OffsetDateTime
,你可以转换为LocalDate
.
LocalDateTime.now().toLocalDate(); # 2015-11-24
Run Code Online (Sandbox Code Playgroud)
plo*_*man 14
我同意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);
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,如果DateTime day
是从昨天开始,那么dayIsYesterday(day)
将返回true
.
该接受的答案是技术上是正确的,但不是最佳.众所周知,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 );
Run Code Online (Sandbox Code Playgroud)
确定昨天的一种方法是转换为LocalDate对象.这里显示的另一种方式是将"昨天"表示为一段时间.我们将这个跨度定义为从昨天的第一个时刻开始,但不包括今天的第一个时刻.这种方法被称为"半开放",其中开头是包容性的,结尾是排他性的.
减去一天到达昨天(或前一天).
DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );
Run Code Online (Sandbox Code Playgroud)
将目标java.util.Date对象转换为Joda-Time DateTime对象.将时区应用于该新对象,而不是依赖于应用JVM的默认时区.从技术上讲,这种情况下的时区是无关紧要的,但包括时区是一个好习惯.
DateTime target = new DateTime( myJUDate, timeZone );
Run Code Online (Sandbox Code Playgroud)
测试目标是否在昨天的间隔内着陆.
boolean isYesterday = yesterdayInterval.contains( target );
Run Code Online (Sandbox Code Playgroud)
显然,这种半开放时间的方法不仅仅是"昨天",例如"本周","上个月"等等.
更新: Joda-Time项目现在处于维护模式.该团队建议迁移到java.time类.请参阅Przemek 正确答案中的java.time解决方案.