我的日期是10.5.2010,例如想知道当天的名字(周一,周二......)。
现在我需要一个具有参数int year
,int month
,int day
的算法,并计算当天的名称,即10.5.2010。但算法也必须能够计算未来的天数。
我硬编码到我的代码中,10.9.2014是星期三,所以我可以用它来计算。你也必须小心闰年,因为你有更多的时间来计算。
有人可以帮助我,只有伪代码才有可能,我想尝试自己做出最大的贡献。如果有几行代码可以,但请不要使用完整的可运行代码
我不想使用任何Java库来使这更容易(例如,没有Calendar
)。
答案 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-1
和month 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;
<强>来源强>
答案 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值到日名的映射。
使用一个月的长度(不是整数)和已知参考的相同技巧可用于在给定日期建立近似月相。一个更好的近似值必须考虑到一天中的时间,并且我确信天文学家会想要考虑一天中的长度和农历月长度的变化......但这对我的目的而言足够接近。