代码之家  ›  专栏  ›  技术社区  ›  Michał Ziober

日期早于一个月前

  •  10
  • Michał Ziober  · 技术社区  · 15 年前

    如何检查给定日期是否早于一个月前?什么是最快的算法?我必须考虑到不同的月份有不同的天数。

    3 回复  |  直到 7 年前
        1
  •  21
  •   OscarRyz    7 年前

    更新到Java 8

    班级 LocalDate 类可以使用:

    LocalDate aDate = LocalDate.parse("2017-01-01");
    return aDate.isBefore( LocalDate.now().minusMonths(1));
    

    对于以前的版本,日历类可以工作。

    Calendar calendar = Calendar.getInstance();
    calendar.add( Calendar.MONTH ,  -1 );
    return aDate.compareTo( calendar.getTime() ) < 0;
    

    样例代码:

    import static java.lang.System.out;
    import java.time.LocalDate;
    
    public class Sample {
        public static void main( String [] args ) {
            LocalDate aMonthAgo = LocalDate.now().minusMonths(1);
            out.println( LocalDate.parse("2009-12-16").isBefore(aMonthAgo));
            out.println( LocalDate.now().isBefore(aMonthAgo));
            out.println( LocalDate.parse("2017-12-24").isBefore(aMonthAgo));
        }
    }
    

    印刷品

    true
    false
    false
    
        2
  •  4
  •   Vinko Vrsalovic    15 年前

    使用 Joda Time :

    DateTime dt1 = new DateTime(); //Now
    DateTime dt2 = new DateTime(2009,9,1,0,0,0,0); //Other date
    if (dt1.plusMonths(-1) > dt2) {
        //Date is earlier than a month ago
    }
    
        3
  •  2
  •   Basil Bourque    7 年前

    DR

    LocalDate.now( ZoneId.of( "America/Montreal"  )
             .minusMonths( 1 )
             .isAfter( LocalDate.parse( "2017-01-23" ) )
    

    Java.时间

    现代方法使用java.time类,而不是像 Date 和; Calendar .

    今天

    首先获取当前日期。这个 LocalDate 类表示没有时间和时区的仅日期值。

    时区对于确定日期至关重要。在任何一个特定的时刻,日期在全球各地各不相同。例如,在 Paris France 是新的一天,而昨天仍然是 Montréal Québec .

    指定一个 proper time zone name 格式为 continent/region ,如 America/Montreal , Africa/Casablanca Pacific/Auckland . 切勿使用3-4字母缩写,如 EST IST 因为它们是 真正的时区,不标准,甚至不独特!.

    ZoneId z = ZoneId.of( "America/Montreal" );
    LocalDate today = LocalDate.now( z );
    

    计算月份前

    接下来,确定 date a month ago .

    LocalDate monthAgo = today.minusMonths( 1 ) ;
    

    以下是使用的规则 LocalDate::minusMonths 引用Java 8类DOC:

    此方法通过三个步骤从“月份”字段中减去指定的金额:

    1. 从“月份”字段中减去输入月份

    2. 检查结果日期是否无效

    3. 如有必要,将月份日期调整为最后一个有效日期

    例如,2007-03-31减去一个月将导致无效日期2007-02-31。不返回无效结果,而是选择该月的最后一个有效日期2007-02-28。

    或者,也许在您的业务规则中,您的意思是“30天”而不是日历月。

    LocalDate thirtyDaysAgo = today.minusDays( 30 ) ;
    

    输入

    有人给你一个约会。应该作为一个 本地日期 对象。

    LocalDate ld = LocalDate.of( 2017 , Month.JANUARY , 23 ) ;
    

    如果来自字符串,请使用标准 ISO 8601 格式。对于其他格式,搜索堆栈溢出 DateTimeFormatter 班级。

    LocalDate ld = LocalDate.parse( "2017-01-23" ) ;
    

    比较

    现在比较一下。打电话给 isBefore , isEqual ,请 isAfter 方法。

    Boolean outdated = ld.isBefore( monthAgo ) ;
    

    性能

    至于绩效问题中提出的问题:不要担心。本月前的计算和比较是 非常 不太可能成为应用程序的瓶颈。避免 premature optimization .


    关于JavaTimes

    这个 java.time 框架是在Java 8和之后构建的。这些阶级取代了麻烦的旧阶级。 legacy 日期时间类,如 java.util.Date , Calendar ,& SimpleDateFormat .

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

    要了解更多信息,请参阅 Oracle Tutorial . 以及搜索堆栈溢出以获得许多示例和解释。规格为 JSR 310 .

    在哪里获取java.time类?

    这个 ThreeTen-Extra Project使用其他类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek ,请 YearQuarter more .