在Java中比较两个字符串的日期

3

我有一个日期,需要检查它是否是周六或周日。我这样做的方式正确吗?

Calendar gcal = new GregorianCalendar();
DateFormat dateFormat = new SimpleDateFormat("EEEE");
        Date currentDate = gcal.getTime();
        String strDate = dateFormat.format(currentDate);
        if (!"Saturday".equals(strDate)) {
}

它的工作正常。但是我无法比较两个字符串,例如:

if (!"Saturday" || "Sunday".equals(strDate)) {}

如果某个日期是周六或周日,我需要跳过循环...... 预先感谢您。

3
你应该使用JDK 8和java.time包。GregorianCalendar是Java 1.0时代的遗物。 - duffymo
!|| 以及其他逻辑运算符的操作数必须是 boolean 类型。你不能仅仅否定一个 String - Lew Bloch
4个回答

6
不需要创建/格式化一个 Date 对象,使用 Calendar 方法即可:
Calendar gcal = new GregorianCalendar();

if (gcal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && gcal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {

}

1
检查一周中的日期的正确方法 +1! - ΦXocę 웃 Пepeúpa ツ
明白了,谢谢@Florent Bayle。 - Jay
FYI,诸如 java.util.Calendar 的老旧日期时间类现在已经成为遗留系统,被 java.time 类所取代。 - Basil Bourque

3

如果日期是周六或周日,我需要跳过循环。

那么应该是:

if (!("Saturday".equals(strDate) || "Sunday".equals(strDate)) {

}

2
虽然这确实回答了OP的问题,但检查星期几的正确方法是使用GC类中的常量。 - ninnemannk

1

太长不读

今天是星期六吗?

LocalDate.now( ZoneId.of( "America/Montreal" ) )
         .getDayOfWeek()
         .equals( DayOfWeek.SATURDAY )

详情

我是否正在正确地进行?

不是。您正在使用已被 java.time 类替代的麻烦的旧日期时间类。

另一个问题是隐式依赖默认时区。最好明确指定您想要的时区。时区确定日期,日期确定星期几,因此时区非常重要。

还有一个问题是您不必要地将 Calendar 转换为 Date。但最好完全避免使用这些类。

DayOfWeek

DayOfWeek 枚举 定义了一周中每天的七个对象。

您应该在代码中传递这些对象,而不是字符串。请注意,在下面的代码中,我们根本不使用字符串。

请明确这些DayOfWeek对象并不是字符串。它们是真正的对象,提供了几种方法。这些方法包括toString,它生成一个硬编码的英文字符串,全部大写。方法getDisplayName会自动在各种人类语言中生成星期几的名称。
Java中的枚举比其他语言中通常看到的更加强大和实用。请参见Oracle教程

LocalDate

LocalDate类代表了一个不带时区和时间的日期值。

时区在确定日期上非常重要。对于任何给定的时刻,日期因时区而变化。例如,在法国巴黎深夜过后几分钟就是新的一天,但在加拿大魁北克省蒙特利尔仍然是“昨天”。

请以大陆/地区的格式指定正确的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。不要使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的!

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

today.toString(): 2017-02-27

查询 LocalDate 对象的 DayOfWeek

DayOfWeek dow = today.getDayOfWeek();

dow.toString(): 星期一

与目标星期几进行比较。

Boolean isTodaySaturday = dow.equals( DayOfWeek.SATURDAY );

isTodaySaturday.toString(): false

尝试这个 在IdeOne.com上的代码实例

参考类似问题:如何在Java 8中添加天数时跳过周末?


关于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可能未来添加的试验场。您可能会在此处找到一些有用的类,例如Interval, YearWeek, YearQuarter更多

0

或者:

if (!strDate.matches("Saturday|Sunday")) {
}

但它速度较慢。


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