【问题标题】:Compare two strings to Date in java将两个字符串与Java中的日期进行比较
【发布时间】:2017-02-28 03:12:05
【问题描述】:

我有一个约会,我必须检查是周六还是周日。我的方法正确吗??

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)) {}

如果日期是周六或周日,我必须跳过循环.... 提前谢谢...

【问题讨论】:

标签: java date


【解决方案1】:

无需创建/格式化Date 对象,使用Calendar 方法:

Calendar gcal = new GregorianCalendar();

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

}

【讨论】:

  • 检查星期+1的正确方法!
  • 明白了.. 谢谢@Florent Bayle
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Calendar 现在是 legacy,被 java.time 类取代。
【解决方案2】:

如果日期是周六或周日,我必须跳过循环。

那么应该是

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

}

【讨论】:

  • 虽然,这确实解决了 OP 的问题.. 检查星期几的正确方法是在 GC 类中使用常量。
【解决方案3】:

tl;博士

今天是星期六吗?

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

详情

我的方法正确吗??

没有。您正在使用已被 java.time 类取代的麻烦的旧日期时间类。

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

另一个问题是您不必要地从Calendar 转换为Date。但最好完全避免这些类。

DayOfWeek

DayOfWeekenum 定义了七个对象,一个用于一周中的每一天。

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

请清楚这些DayOfWeek 对象是不是字符串。它们是真实的对象,提供了多种方法。这些方法包括toString,它生成一个硬编码的英文字符串,全部大写。方法getDisplayName 生成自动本地化为各种人类语言的星期几的名称。

Java 中的枚举比其他语言中的传统枚举更加强大和实用。见Oracle Tutorial

LocalDate

LocalDate 类表示没有时间和时区的仅日期值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

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

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

tod​​ay.toString(): 2017-02-27

查询LocalDate 对象的DayOfWeek

DayOfWeek dow = today.getDayOfWeek();

dow.toString(): 星期一

与您的目标星期几比较。

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

isTodaySaturday.toString(): false

试试这个code live at IdeOne.com

查看类似问题:How to skip weekends while adding days to LocalDate in Java 8?


关于java.time

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

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案4】:

    或者:

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

    但速度较慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多