代码之家  ›  专栏  ›  技术社区  ›  QWERTY

检查日期是否比今天早一周Java

  •  1
  • QWERTY  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  2
  •   Paul Hicks    6 年前

    仅使用 Date Calendar 类(因此,我认为它与4-ish中的任何JVM都兼容?)您可以尝试以下解决方案:

    1. 今天作为 日期 : Date now = new Date()
    2. 一周前的事,作为一个 日历 : Calendar expected = Calendar.getInstance(); expected.setTime(now); lastWeek.add(Calendar.WEEK_OF_YEAR, -1);
    3. 将过期日期作为 日历 : 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));

    使用这个,您应该能够找到一个更短的片段,从现在开始减去一周,并比较两者的长值虽然这显然不是比较日历日期,而是比较纳秒:)

        2
  •  2
  •   payne    6 年前

    下面是一个完整的解决方案:

    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 如果没有)。

    一个很好的简单的一行程序,你可以从你的应用程序的任何地方调用如果你的问题得到了正确的回答,请随意标记为答案:)

        3
  •  2
  •   Basil Bourque    6 年前

    tl;博士

    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公司 上课更容易处理那些可怕的旧遗产 Date , Calendar 等等。

    检查日期是否比今天早一周Java

    你是不是只想和日期打交道,而忽略了一天中的时间我想不会,因为你的输入有一天的时间。

    以UTC格式获取当前时刻。

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

    调整到暗示为日期时间输入字符串上下文的时区应用 ZoneId 得到一个 ZonedDateTime 反对。

    指定一个 proper time zone name 格式为 continent/region ,例如 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.time 框架构建在Java8和更高版本中这些类取代了麻烦的旧类 legacy 日期时间类,如 java.util.Date , Calendar ,& SimpleDateFormat .

    这个 Joda-Time 项目,现在在 maintenance mode ,建议迁移到 java.time 上课。

    要了解更多信息,请参阅 Oracle Tutorial . 和搜索堆栈溢出的许多例子和解释规格是 JSR 310 .

    你可以交换 java.time公司 直接使用数据库的对象使用 JDBC driver 符合 JDBC 4.2 或者以后不需要弦,不需要 java.sql.* 上课。

    在哪里获得java.time类?

        4
  •  1
  •   Vikasdeep Singh    6 年前

    Java 8独立

    用简单的方法做怎么样,从两次约会中抽出时间,找出 difference . 转换此 差异 进入之内 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");
    

    这会给你两次约会的区别 它可以是 negative 如果到期日是将来的并且 positive 如果过期了。