在Java中不使用日历功能查找星期几

时间:2016-10-30 18:53:33

标签: java calendar

好吧,这里有点奇怪的问题......我需要找到MM-DD-YYYY的星期几(即星期一,星期二......)。所以基本上java日历会做什么,但不使用java日历。

5 个答案:

答案 0 :(得分:1)

虽然不寻常,但可以计算一个与日历日期中星期几相对应的数字。

简而言之,您首先需要计算日历日期中的序列日期编号,即自某个固定时间点起已经过的连续天数(非正式地称为'纪元& #39)。在现代计算中遇到的最常遇到的序列日期方案是Posix Time,其时间日期为1970年1月1日午夜UTC。

您需要确定此计算所需的精确度,例如。你是否需要考虑朱利安历法(在1584年教皇格雷戈里改革格列高利历之前用于欧洲大部分地区),是否纠正世纪日等等。

有几种算法可用于将日历日期算术转换为具有给定纪元的序列日期编号。从历史上看,这些计算最常用的时期是朱利安日数系统(不要与朱利安历法相混淆),它计算公元前4714年11月24日公历中的公历。下面是Java代码,它实现了Jean Meeus在他的着作" Astronomical Algorithms,2nd Ed。"该算法计算朱利安日数,并假设天数正好是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(一周中的天数)的余数计算星期几。

答案 1 :(得分:0)

如果您只是简单地避免使用日历对象,那么您可以使用日期对象(不建议使用),但仍然有效并调用setMonth,setYear和setDate来获取所需的日期。然后,您必须使用DateFormatter来获得所需的输出。我使用SimpleDateFormat和E说明符来获取星期几。

  Date dNow = new Date();
  SimpleDateFormat ft = new SimpleDateFormat ("E");

  System.out.println("Current Date: " + ft.format(dNow));

输出当前星期几“太阳”,“星期六”等。 此链接有助于格式化https://www.tutorialspoint.com/java/java_date_time.htm

答案 2 :(得分:0)

java.time

使用取代麻烦的旧日期时间类的java.time类。 LocalDate类表示没有时间且没有时区的日期。

DayOfWeek dow =
    LocalDate.parse( 
        "01-23-2016" , 
        DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
    ).getDayOfWeek()

该代码返回DayOfWeek枚举对象。从那里你可以询问:

  • 整数,周一至周日1-7
  • 当天的本地化名称。

示例代码。

int dowNumber = dow.getValue() ;
String dowName = dow.getDisplayName( 
    TextStyle.FULL , 
    Locale.CANADA_FRENCH ) ;  // Or Locale.US, Locale.ITALY, etc.

提示:在您自己的代码中传递DayOfWeek个对象,而不是在内部跟踪星期几作为数字或字符串。这使您的代码更加自我记录,确保有效值,并提供type-safety

答案 3 :(得分:0)

好吧,我们可以使用高斯的方法找到星期几。像这样,

import java.util.Scanner;

public class DayOfWeek
{
    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);
        int month, day, year;           
        // getting month, day and year from user
        System.out.println("Please enter month - ");
        month = sc.nextInt();
        System.out.println("Please enter day - ");
        day = sc.nextInt();
        System.out.println("Please enter year - ");
        year = sc.nextInt();
        sc.close();

        double a;
        int y;
        int temp;

        a = (month - 2 + 12) % 12;
        if(month <= 2)
        {
            year--;
        }

        y = 5 * (year % 4) + 4 *(year % 100) + 6 * (year % 400);
        temp = (day + (int)(2.6 * a - 0.2) + y) % 7;
        System.out.println("day of week(sun = 0, mon = 1,....... sat = 6) : " + temp);      
    }
}

输出:

Please enter month - 1
Please enter day - 1
Please enter year - 1900
day of week(sun = 0, mon = 1,....... sat = 6) : 1

有关java中日期和时间的更多信息,请参阅datetime java program

答案 4 :(得分:0)

我自己在寻找答案,并根据Zeller's algorithm找到了另一个答案:

// d = day in month
// m = month (January = 1 : December = 12)
// y = 4 digit year
// Returns 0 = Sunday .. 6 = Saturday
public int dow(int d, int m, int y) {
  if (m < 3) {
    m += 12;
    y--;
  }
  return (d + int((m+1)*2.6) +  y + int(y/4) + 6*int(y/100) + int(y/400) + 6) % 7;
}

来源:here