检查日期是否是今天Java的前一周

时间:2018-07-23 00:38:54

标签: java android date

我正在尝试检查某个特定日期是否比今天的日期早一周。我将日期格式化为以下格式:

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

有什么想法吗?谢谢!

4 个答案:

答案 0 :(得分:2)

仅使用DateCalendar类(因此,我认为可以与大约4 ish的任何JVM兼容吗?),您可以尝试这种解决方案:

  1. Date的身份获得今天的奖励:Date now = new Date()
  2. 从一周前开始以Calendar的身分Calendar expected = Calendar.getInstance(); expected.setTime(now); lastWeek.add(Calendar.WEEK_OF_YEAR, -1);
  3. Calendar的形式获取过期日期:Calendar actual = Calendar.getInstance().setTime(expiredDate);
  4. 比较两个日历的年和日(您可以比较其他字段,但是这两个字段应该足够):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)

tl; dr

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

现代解决方案使用 java.time 类。糟糕的旧版DateCalendar等更容易使用。

  

检查日期是否是今天Java的前一周

您打算只使用日期,而忽略时间吗?我不会,因为您输入的内容是一天中的某个时间。

获取UTC当前时刻。

Instant instant = Instant.now() ;  // Current moment in UTC.

调整为日期时间输入字符串的上下文所隐含的时区。应用ZoneId获得一个ZonedDateTime对象。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance 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