2017-02-27 141 views
3

我有一个日期,我必须检查它是星期六还是星期日。我是否正确的方式?比较两个字符串在java中的日期

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

+0

[String.equals()具有多个条件(以及对结果的一个操作)]的可能重复](http://stackoverflow.com/questions/10208052/string-equals-with-multiple-conditions-and-one-action- on-result) – Tom

+0

'!'和'||'和其他逻辑运算符的操作数必须是'boolean'。你不能否定'String'! –

回答

7

无需创建/格式化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! –

+0

Gotcha ..谢谢@Florent Bayle – jai

+0

仅供参考,麻烦的旧日期时间类,如['java.util.Calendar'](https://docs.oracle.com/javase/8/docs/api/java/ util/Date.html)现在是[legacy](https://en.wikipedia.org/wiki/Legacy_system),取而代之的是[java.time](https://docs.oracle.com/javase/8/ docs/api/java/time/package-summary.html)类。 –

3

如果日期是星期六或星期天我必须跳过循环。

那么它应该是

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

} 
+2

虽然,这确实解决OP的问题..检查星期几的正确方法是使用GC类中的常量。 – ninnemannk

0

或者:

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

但它是慢。

1

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/Casablanca,或Pacific/Auckland。切勿使用3-4字母缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

today.toString():2017年2月27日

讯问LocalDate对象为其DayOfWeek

DayOfWeek dow = today.getDayOfWeek(); 

dow.toString():周一

比较你的目标日的一周。

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

isTodaySaturday.toString():假

试试这个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.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore