如何检查特定日期是否已过去

23

我有一个形如“mm/yyyy”的字符串,想将其与本地系统的日期进行比较。

我考虑使用一个将我的月份与日历中的MONTH字段进行转换的表格,例如:

    Calendar cal = Calendar.getInstance();
    String date = "07/2014";
    String month = date.subString(0, 2);
    int monthToCompare;
    if (month.equals("01"))
      monthToCompare = cal.JANUARY;
    if (month.equals("02"))
      monthToCompare = cal.FEBRUARY;
    ...

然后手动使用if语句进行比较。我不喜欢这种方式,因为我认为对于如此简单的操作来说太冗长了。

我想到的另一种选择是获取当前的Date()并使用before()方法。这意味着要将我的日期转换为Date格式,但易于使用的方法已被弃用,我必须指定毫秒数,而我不知道如何轻松地做到这一点(考虑到自1970年以来的闰年、日历纠正等因素)。


1
我说过我知道这两种方法,但我不知道如何从字符串创建一个日期对象来进行比较。 - user2891462
1
你看过DateFormat.parse()了吗? - Kevin L
1
Java字符串转日期转换 - Basil Bourque
1
鉴于java.util.Datejava.util.Calendarjava.text.SimpleDateFormat等老旧的日期时间类现已成为遗留系统,被Java 8和Java 9内置的java.time类所取代。请参见Oracle的教程。提示:使用YearMonth类。 - Basil Bourque
重新开放,因为我注意到这里的问题仅以年月开头,而不是完整日期。这与我们标记的重复不同。 - Basil Bourque
4个回答

51

使用@Mifmif的回答,我终于解决了这个问题:

if (new SimpleDateFormat("MM/yyyy").parse(date).before(new Date())) {
    ...
}

8

请尝试以下方法:

new SimpleDateFormat("MM/yyyy").parse("07/2014").compareTo(new Date());

5
他的目标似乎不太可能是想知道每个月的第一天恰好午夜零毫秒的时间。 - Affe

4

简而言之

YearMonth.parse( 
    "07/2014" , 
    DateTimeFormatter.ofPattern( "MM/uuuu" )
).isAfter(
    YearMonth.now(
        ZoneId.of( "Africa/Tunis" )
    )
)

java.time

现代解决方案使用java.time类而不是麻烦的旧日期时间类。
年份和月份仅需使用YearMonth类来表示整个月。
String input = "07/2014" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = YearMonth.parse( input , f ) ;

提示:在整个代码库中使用这样的YearMonth对象而不是仅仅使用一个字符串。当您需要一个字符串来交换数据时,请使用标准的ISO 8601格式:YYYY-MM。Java.time类在解析/生成字符串时默认使用标准格式,因此无需定义格式模式。
当前年月
确定当前年月意味着确定当前日期。
时区对于确定日期至关重要。对于任何给定的时刻,日期会因时区而在全球范围内变化。例如,在法国巴黎午夜后几分钟是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。
如果没有指定时区,则JVM隐式地应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将您期望的时区明确指定为参数。

请使用格式为continent/region正确时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。 切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的!

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

如果您想使用JVM的当前默认时区,请请求并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好明确说明,因为默认值可能在运行时的任何线程中的任何应用程序的任何代码中随时更改。
ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

同样的想法适用于获取当前的YearMonth:传递一个ZoneId

YearMonth currentYearMonth = YearMonth.now( z ) ;

对比

使用方法 isBefore, isAfter, 和 equals 进行对比。

boolean isAfterCurrentYearMonth = ym.isAfter( currentYearMonth ) ;

关于 java.time

java.time 框架内置于 Java 8 及更高版本。这些类替代了旧的麻烦 遗留 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time项目目前处于维护模式,建议迁移到java.time类。

想了解更多信息,请参见Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310

如何获取java.time类?

ThreeTen-Extra项目通过添加额外的类来扩展java.time。该项目是java.time可能未来添加的潜在场所。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuarter更多


2
 //getting current date

private String getDateTime() {           

    DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.getDefault());

    Date date = new Date();

    return dateFormat.format(date);
}


//compare the dates

Date date1  = new Date("second_date to be compared");

Date date2 = new Date(getDateTime());


if(date1.before(date2)) {

     Log.d("Date already passed", " " + "second_date");
}

1
感谢您想要做出贡献。请不要教年轻人使用早已过时且臭名昭著的 SimpleDateFormat 类。至少不要将其作为第一选择。而且不要没有任何保留地使用它。今天我们有更好的选择,即 java.time,现代 Java 日期和时间 API 及其 DateTimeFormatter。是的,您可以在 Android 上使用它。对于旧版 Android,请参见 如何在 Android 项目中使用 ThreeTenABP - Ole V.V.
对我来说,使用SimpleDateFormat和Date非常好。我曾经使用Calendar遇到非常糟糕的经历。在某些设备上,使用Calendar日期会变得混乱。 - Boris Legovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接