【问题标题】:Usisng Calendar to determine if it is monday, tuesday or使用日历确定是星期一、星期二还是
【发布时间】:2014-03-14 05:24:48
【问题描述】:

如果是周一、周二或周三,我想提前 2 天,如果是周四或周五,我想提前 2 天。但我对逻辑公式有疑问。看起来 Java 程序员没有正确设置最终值。无论星期几,第一个陈述似乎总是正确的。

import static java.util.Calendar.*;
import java.util.GregorianCalendar;


public class Demo {
    public static void main(String[] args) {
        GregorianCalendar gc = new GregorianCalendar();
        gc.roll(DAY_OF_WEEK, 2);
        if((gc.get(DAY_OF_WEEK) & (MONDAY | TUESDAY | WEDNESDAY)) == gc.get(DAY_OF_WEEK)){
            System.out.println("it is monday or tuesday or wednesday");
            gc.roll(DAY_OF_WEEK, 2);            
        }else{
            System.out.println("other day");
        }
    }
}

【问题讨论】:

  • 看起来问题出在您进行检查的按位运算中。试着先写个长篇大论:ìf (gc.get(DAY_OF_WEEK) == MONDAY || gc.get(DAY_OF_WEEK) == TUESDAY ...).
  • 我知道该怎么做,但我想做得更好。
  • 但我想做得更好这样会更好:性能(通过节省 0.010 毫秒)、可维护性(实际上,对于没有经验的人来说,可读性较差程序员)、可移植性、安全性、可用性、可修改性……?无论如何,如果这是您的目标,您应该将问题移至codereview.stackexchange.com

标签: java calendar


【解决方案1】:

星期几代表值

SUNDAY = 1;
MONDAY = 2;
TUESDAY = 3;
WEDNESDAY = 4;
THURSDAY = 5;
FRIDAY = 6;
SATURDAY = 7;

所以您需要做的就是检查gc.get(DAY_OF_WEEK) 的结果是否在24(包括)之间,所以也许将您的条件更改为

if (MONDAY <= gc.get(DAY_OF_WEEK) && gc.get(DAY_OF_WEEK) <= WEDNESDAY) {

请记住,过早优化是万恶之源。专注于为人类编写代码。

【讨论】:

  • 另外,MONDAY | TUESDAY | WEDNESDAY == 2 | 3 | 4 == 71 &lt;= x &lt;= 7 的任何 x 将使 x &amp; 7 等于 x。这就是为什么问题中的表达总是正确的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多