java - 在 Java 中不使用日历函数查找星期几

标签 java calendar

我需要根据 MM-DD-YYYY 找到一周中的某一天(即星期一、星期二...)。所以基本上java日历会做什么,但不使用java日历。

最佳答案

虽然不常见,但可以根据日历日期计算出与星期几相对应的数字。

简而言之,您首先需要根据日历日期计算一个日期序列号,即自某个固定时间点(非正式地称为“纪元”)以来经过的连续天数。现代计算中最常见的串行日期方案是 Posix Time,其纪元日期为 UTC 时间 1970 年 1 月 1 日午夜。

您需要决定此计算所需的精度级别,例如。是否需要考虑儒略历(在 1584 年教皇格列高利进行公历改革之前欧洲大部分地区使用),是否需要修正世纪日等。

有多种算法可用于将日历日期算术转换为给定纪元的日期序列号。从历史上看,这些计算中最常用的纪元是儒略日数字系统(不要与儒略历混淆),该系统从公历中的公元前 4714 年 11 月 24 日开始计算天数。下面是 Java 代码,它实现了 Jean Meeus 在他的书“天文算法,第二版”中发布的一种此类算法。该算法计算儒略日数并假设天的长度正好是 86400 秒,考虑到一般公历改革,并考虑世纪和闰日:

public class JulianDay {

    private static final int YEAR = 0;
    private static final int MONTH = 1;
    private static final int DAY = 2;
    private static final int HOURS = 3;
    private static final int MINUTES = 4;
    private static final int SECONDS = 5;
    private static final int MILLIS = 6;

    :
    :

    // Converts a timestamp presented as an array of integers in the following
    // order (from index 0 to 6): year,month,day,hours,minutes,seconds,millis
    // month (1-12), day (1-28 or 29), hours (0-23), min/sec (0-59) to a
    // Julian Day Number.
    // For clarity and simplicity, the input values are assumed to be well-formed;
    // error checking is not implemented in the snippet.

    public static double toJD(int[] ymd_hms) {

        int y = ymd_hms[YEAR];
        int m = ymd_hms[MONTH];
        double d = (double) ymd_hms[DAY];

        d = d + ((ymd_hms[HOURS] / 24.0) +
                 (ymd_hms[MINUTES] / 1440.0) +
                 (ymd_hms[SECONDS] / 86400.0) +
                 (ymd_hms[MILLIS] / 86400000.0));

        if (m == 1 || m == 2) {
            y--;
            m = m + 12;
        }

        double a = Math.floor(y / 100);
        double b = 2 - a + Math.floor(a / 4);

        return (Math.floor(365.25 * (y + 4716.0)) +
               Math.floor(30.6001 * (m + 1)) +
               d + b - 1524.5);
    }
}

一旦获得了日期序列号,就可以直接根据日期号除以 7(一周中的天数)得到的余数计算出星期几。

关于java - 在 Java 中不使用日历函数查找星期几,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40332445/

相关文章:

java - @Dependent bean 中的 CDI 观察者条件

android - 三星浏览器无法下载 .ics 文件以添加到日历

android - 在 native Android 日历上添加事件会导致 NullPointerException

javascript - 在 AngularJS 1.x 中单击时在 UI 日历中添加事件

javascript - Date 对象曾经使用过非公历吗?

java - 变量的范围规则

java - 使用 Autowiring 的 Spring Boot 字段注入(inject)在 JUnit 测试中不起作用

java - 在 TestNG @DataProvider 中进行的数据库更新不会回滚

Java检测鼠标长按

java - 是否需要调用 Java 的 Calendar.getTime() 来更新对象?