You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java基础计算问题:日期转星期几结果不符求助

排查日期转星期几计算错误的问题

看起来你用的是蔡勒公式(Zeller's Congruence),但代码里有几个关键问题导致结果不符合预期,我来一步步帮你分析:

1. 月份的特殊处理缺失

标准的蔡勒公式中,1月和2月需要被当作上一年的13月和14月来计算。比如2024年1月1日,要按2023年13月1日代入公式;2024年2月1日则按2023年14月1日计算。你的代码直接使用输入的1/2月,这会从根源上导致计算逻辑错误。

2. 浮点数除法的精度问题

你代码里用了/10.0/4.0这类浮点数除法,然后强制转换为int。这种方式会因为浮点数的精度误差导致取整错误——公式里的除法要求是向下取整(floor),对于正整数来说,Java的整数除法/本身就是向下取整,完全可以用整数运算替代浮点数运算,避免不必要的精度丢失。

3. 结果的映射关系错误

蔡勒公式的计算结果和星期的对应关系需要调整:你的代码返回的weekDay值,默认映射通常是0=周六,1=周日,2=周一...6=周五,但你期望的是1=周日的映射规则,所以需要对结果做偏移处理,才能得到符合预期的输出。


修正后的代码

下面是修复了以上问题的完整实现:

import java.util.Scanner;

public class DayOfWeekCalculator {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter year: (e.g., 2012): ");
        int year = sc.nextInt();
        System.out.println("Enter month: 1-12: ");
        int month = sc.nextInt();
        System.out.println("Enter the day of the month: 1-31: ");
        int day = sc.nextInt();

        // 处理1月和2月的特殊情况,转为上一年的13/14月
        if (month < 3) {
            month += 12;
            year -= 1;
        }

        int k = year % 100; // 年份的后两位
        int j = year / 100; // 年份的前两位
        // 用整数除法替代浮点数运算,避免精度问题
        int weekDay = (day + (26 * (month + 1)) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;

        // 调整映射关系:让结果符合你需要的1=周日,2=周一...7=周六的规则
        int result = weekDay == 0 ? 7 : weekDay;
        // 如果只需要1代表周日,其他按顺序对应,也可以直接用weekDay(此时1=周日,2=周一...6=周五,0=周六)

        System.out.println("对应的星期是:" + result);
        sc.close();
    }
}

测试验证

比如输入已知日期2024年10月1日(周二):

  • 月份10无需调整,year=2024
  • k=24,j=20
  • 计算:1 + (26*(10+1))/10 +24 +24/4 +20/4 +5*20 = 1 + 28 +24 +6 +5 +100 = 164
  • 164%7=3 → 对应3=周二,符合预期。

如果输入2024年1月1日(周一):

  • 调整后month=13,year=2023
  • k=23,j=20
  • 计算:1 + (26*(13+1))/10 +23 +23/4 +20/4 +5*20 =1 + 36 +23 +5 +5 +100=170
  • 170%7=2 → 对应2=周一,正确。

内容的提问来源于stack exchange,提问作者Jay.

火山引擎 最新活动