我正在尝试检查某个特定日期是否比今天的日期早一周。我将日期格式化为以下格式:
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
然后,我通过以下代码从for循环中获取日期列表:
Date formattedToday = formatter.parse(todayStr);
Date formattedExpired = formatter.parse(expiredDate);
列表中日期的示例为:
09/12/2017 08:09 PM
10/24/2015 02:09 AM
07/18/2018 03:10 AM
我尝试遵循this thread,但不允许添加任何外部库。
另一个需要Java 8
的解决方案也不适用于我,因为我当前的最低 API是25 ,但是ChronoUnit
需要API 26
。
有什么想法吗?谢谢!
答案 0 :(得分:2)
仅使用Date
和Calendar
类(因此,我认为可以与大约4 ish的任何JVM兼容吗?),您可以尝试这种解决方案:
Date
的身份获得今天的奖励:Date now = new Date()
Calendar
的身分Calendar expected = Calendar.getInstance(); expected.setTime(now); lastWeek.add(Calendar.WEEK_OF_YEAR, -1);
Calendar
的形式获取过期日期:Calendar actual = Calendar.getInstance().setTime(expiredDate);
return (expected.get(Calendar.YEAR) == actual.get(Calendar.YEAR)) && (expected.get(Calendar.WEEK_OF_YEAR) == actual.get(Calendar.WEEK_OF_YEAR));
使用此方法,您应该能够提出一个更短的代码段,该代码段从现在开始减去一周,然后比较两者的长值。尽管显然不会比较日历日期,但会比较纳秒:)
答案 1 :(得分:2)
这是一个完整的解决方案:
import java.util.Calendar;
import java.util.Date;
/**
* @author Jeremi Grenier-Berthiaume
*/
public class InternalDate {
private int year = 0;
private int month = 0;
private int day = 0;
private InternalDate(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
private static InternalDate generateFromCalendar(Calendar calendar) {
int lYear = calendar.get(Calendar.YEAR);
int lMonth = calendar.get(Calendar.MONTH) + 1; // January = 1st month
int lDay = calendar.get(Calendar.DAY_OF_MONTH);
return new InternalDate(lYear, lMonth, lDay);
}
/**
* Constructor for a textual format.
*
* @param text Format "DD/MM/YYYY" followed by more chars which will be ignored if they are present.
* @return Associated InternalDate
*/
private static InternalDate generateDateFromText(String text) {
int year, month, day;
char selectedChar = '/';
text = text.substring(0,10); // to remove hours
// Extract the data required to construct the InternalDate
String[] splitDateText = text.split(""+selectedChar);
day = Integer.parseInt(splitDateText[0]);
month = Integer.parseInt(splitDateText[1]);
year = Integer.parseInt(splitDateText[2]);
return new InternalDate(year, month, day);
}
private static InternalDate getLastWeek() {
// Get current date
Calendar tempCal = Calendar.getInstance();
tempCal.setTime(new Date());
// 7 days ago
tempCal.add(Calendar.DAY_OF_MONTH, -7);
return generateFromCalendar(tempCal);
}
public static boolean isLastWeek(String compared) {
int tmpDate = Integer.parseInt(InternalDate.getLastWeek().getComparableStringDate());
int tmpCompDate = Integer.parseInt(InternalDate.generateDateFromText(compared).getComparableStringDate());
return tmpDate == tmpCompDate;
}
}
将您要验证的日期形成为格式为DD/MM/YYYY
的字符串,并将其输入到InternalDate.isLastWeek(stringDate);
中将为您提供答案(它返回布尔值:true
这是一周前的日期,如果没有,则为false
。
一个好又简单的单行代码,您可以在应用程序中的任何位置调用它。如果它确实正确回答了您的问题,请随意将其标记为答案。 :)
答案 2 :(得分:2)
ZonedDateTime
.now() // Captures current moment as seen by the wall-clock time of the JVM’s current default time zone. Better to pass the optional `ZoneId` argument to specify explicitly the desired/expected time zone.
.minusWeeks( 1 )
.isAfter(
LocalDateTime
.parse(
"09/12/2017 08:09 PM" ,
DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm a" , Locale.US )
)
.atZone(
ZoneId.systemDefault() // Better to pass explicitly the time zone known to have been intended for this input. See discussion below.
)
)
现代解决方案使用 java.time 类。糟糕的旧版Date
,Calendar
等更容易使用。
检查日期是否是今天Java的前一周
您打算只使用日期,而忽略时间吗?我不会,因为您输入的内容是一天中的某个时间。
获取UTC当前时刻。
Instant instant = Instant.now() ; // Current moment in UTC.
调整为日期时间输入字符串的上下文所隐含的时区。应用ZoneId
获得一个ZonedDateTime
对象。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ; // Replace with the zone you know to have been intended for the input strings.
ZonedDateTime zdtNow = instant.atZone( z ) ; // Adjust from UTC to a time zone.
减去一周,这是您在问题中提出的要求。
ZonedDateTime zdtWeekAgo = zdtNow.minusWeeks( 1 ) ; // Accounts for anomalies such as Daylight Saving Time (DST).
将输入字符串解析为LocalDateTime
对象,因为它们缺少任何时区指示或距UTC的偏移量。
提示:尽可能更改这些输入以包括其时区。并更改其格式以使用标准ISO 8601格式,而不是自定义格式。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm a" , Locale.US ) ;
LocalDateTime ldt = LocalDateTime.parse( "09/12/2017 08:09 PM" , f ) ;
为这些输入字符串分配已知的时区。
ZonedDateTime zdt = ldt.atZone( z ) ;
比较。
boolean moreThanWeekOld = zdt.isBefore( zdtWeekAgo ) ;
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
答案 3 :(得分:1)
独立于Java 8
如何以简单的方式做到这一点,即从两个日期中获取时间并找到difference
。将此difference
转换为days
,以获取days
中两个日期之间的差。下面是工作代码:
Date formattedToday = new Date();
Date formattedExpired = new Date("06/12/2018 08:09 PM");
int diffInDays = (int)( (formattedToday.getTime() - formattedExpired.getTime())
/ (1000 * 60 * 60 * 24) );
if (diffInDays > 7)
Log.i("Expiration Status : ", "Expired");
它将为您提供days
中两个日期之间的差异,如果到期日期是将来的日期,则可以为negative
,如果到期日期是过去的日期,则可以为positive
。