计算日期名称的算法

时间:2014-09-10 06:33:08

标签: java date date-arithmetic

我的日期是10.5.2010,例如想知道当天的名字(周一,周二......)。

现在我需要一个具有参数int yearint monthint day的算法,并计算当天的名称,即10.5.2010。但算法也必须能够计算未来的天数。

我硬编码到我的代码中,10.9.2014是星期三,所以我可以用它来计算。你也必须小心闰年,因为你有更多的时间来计算。

有人可以帮助我,只有伪代码才有可能,我想尝试自己做出最大的贡献。如果有几行代码可以,但请不要使用完整的可运行代码

我不想使用任何Java库来使这更容易(例如,没有Calendar)。

5 个答案:

答案 0 :(得分:3)

使用现有算法/公式从给定日期派生星期几。有一个公式来源于高斯公式,该公式描述了计算任何给定年份1月1日的星期几的方法。派生公式适用于所有日期。

  

设A - 1 =年= Y

     

m =月 - 2 mod 12(3月= 1,...,1月= -1 mod 12 = 11,2月= 12)

由于月份m为m-2 mod 12,1月份为year-1(shifting to previous year since month is getting negative)month-2 (i.e 12-2 = 10 , 12 is because year is shifted to previous)个月,同样2月将为year-1month 11 (12-1=11),3月将为同一年和月3-2 =1

  

d =每月的几天,

     

w = d + [2.6m - 0.2] + 5R(Y,4)+ 4R(Y,100)+ 6R(Y,400)\ mod 7.

这里w是一周的一周,例如星期日为0,星期六为1,等等。

一个明确的例子: -

  

2000年1月1日,该日期将被视为1999年的第11个月,

     

d = 1

     

[2.6×11 - 0.2] = 28 mod 7 = 0

     

5R(99,4)= 5×3 = 15 mod 7 = 1

     

4R(1999,100)= 4×99 mod 7 = 4×1 = 4

     

6R(1999,400)= 6×399 mod 7 = 6×0 = 0

     

3R(99,7)= 3×1 = 3

     

5R(19,4)= 5×3 mod 7 = 1

     

w = 1 + 0 + 1 + 4 + 0 = 1 + 0 + 1 + 3 + 1 = 6 =星期六。

您可以对此算法进行编码,它应该像魅力一样工作,无需对特定日期进行硬编码并根据该日期计算天数。

注意: - 这适用于公历,适用于其他日历,更多示例请参阅here

答案 1 :(得分:2)

您可以使用Conway的世界末日规则来确定指定日期的星期几。

实施相对容易,并且会产生三个参数(YYYY),(MM)和(DD) 0到6之间的数字,表示该日期的星期几。

星期几用0到6之间的整数表示,其中0表示星期日,星期六表示星期六。如果需要当天的字符串表示,请将整数映射到名称。

以下示例是用PHP而不是Java编写的,但您应该能够轻松地将其翻译出来:

$months = [0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4];

$year  -= $month < 3 ? 1 : 0;

return ($year
      + $year / 4
      - $year / 100
      + $year / 400
      + $months[$month - 1]
      + $day) % 7;

<强>来源

Wikipedia.org
DoomsdayRule.blogspot.com

答案 2 :(得分:0)

这里有一些伪代码,当然没有测试过,但是这样的东西应该有效:

int day, month, year;
int baseDay = 10, baseMonth = 9, baseYear = 2014;

int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

day = getDayFromDate();
month = getMonthFromDate();
year = getYearFromDate();

if year > baseYear
    if month > baseMonth
        if day > baseDay
            //
        else
            //
    else
        if day > baseDay
            //
        else
            //
else
    if month > baseMonth
        if day > baseDay
            //
        else
            //
    else
        if day > baseDay
            //
        else
            //

一旦你通过这些ifs来确定比当前日期更少/更多的天数,将结果模数为7(x%7)以获得前/后多少天,例如

如果提前38天,38%7 = 3,那么周三+ 3 =周六

如果落后9天,9%7 = 2,那么周三 - 2 =周一

答案 3 :(得分:0)

寻找虚弱的日子。

      String input_date="10/09/2012";
      SimpleDateFormat format1=new SimpleDateFormat("dd/MM/yyyy");
      java.util.Date dt1=format1.parse(input_date);
      DateFormat format2=new SimpleDateFormat("EEEE"); 
      String finalDay=format2.format(dt1);  

将来你可以将日期添加到当前日期,并且在以类似的方式添加之后你可以获得弱者的日子。

    Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(start_date);
        cal.add(Calendar.DATE, days_in_futur)));
        java.util.Date next_date = cal.getTime();

答案 4 :(得分:0)

我过去的解决方案是计算Julian/Astronomical Day Number,取模7,并使用已知日期建立从0-6值到日名的映射。

使用一个月的长度(不是整数)和已知参考的相同技巧可用于在给定日期建立近似月相。一个更好的近似值必须考虑到一天中的时间,并且我确信天文学家会想要考虑一天中的长度和农历月长度的变化......但这对我的目的而言足够接近。