Формула даты, расчет високосного года, недели и т. Д. В персидской дате
old title: Как рассчитать номер недели в данном месяце
Из-за ответа, который я предоставляю, я меняю название...
я создаю библиотеку, чтобы затем обернуть ее в своем проекте, который предоставляет некоторую информацию о дате в моей культуре,
библиотека выглядит так:
///<reference path="IDate.ts"/>
/**
* Created by Hassan on 1/28/2016.
*/
// Help References:
// 1- http://www.aftabir.com/encyclopedia/urgent/calendar/chronometry/leapyear_new.php
var PersianDate = (function () {
function PersianDate(year, month, day, firstDayOfWeek) {
this.day = day;
this.month = month;
this.year = year;
this.firstDayOfWeek = firstDayOfWeek;
}
PersianDate.prototype.isLeapYear = function () {
var year = this.year;
//var a = 0.025;
//var b = 266;
//var leapDays0;
//var leapDays1;
//var frac0;
//var frac1;
//if (year > 0) {
// leapDays0 = ((year + 38) % 2820) * 0.24219 + a; // 0.24219 ~ extra days of one year
// leapDays1 = ((year + 39) % 2820) * 0.24219 + a; // 38 days is the difference of epoch to 2820-year cycle
//}
//else if (year < 0) {
// leapDays0 = ((year + 39) % 2820) * 0.24219 + a;
// leapDays1 = ((year + 40) % 2820) * 0.24219 + a;
//}
//else {
// return false;
//}
//frac0 = Math.floor((leapDays0 - Math.floor(leapDays0)) * 1000);
//frac1 = Math.floor((leapDays1 - Math.floor(leapDays1)) * 1000);
//if (frac0 <= b && frac1 > b)
// return true;
//else
// return false;
var a = year+2346;
var a2 = year-1 + 2346; //(A-1)=N-1+2346 -> 'A-1' is just a name of last year
var b1 = Math.ceil(a * 365.24219879);
var b2 = Math.ceil(a2 * 365.24219879);
return b1 - b2 == 366;
};
PersianDate.prototype.getDaysInMonth = function () {
switch (this.month) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
return 31;
case 7:
case 8:
case 9:
case 10:
case 11:
return 30;
case 12:
return (this.isLeapYear() ? 30 : 29);
}
return undefined;
};
PersianDate.prototype.getDaysInWeek = function () {
return 7;
};
PersianDate.prototype.getDaysInYear = function () {
return 365 + (this.isLeapYear() ? 1 : 0);
};
PersianDate.prototype.getMonthsInYear = function () {
return 12;
};
PersianDate.prototype.getWeeksInYear = function () {
return this.getDaysInYear() + (this.getWeekFirstDay()) / 7;
};
PersianDate.prototype.getWeeksInMonth = function () {
var month = this.getMonth();
console.log(month);
var totalDaysToMonthStart;
if (month <= 7) {
totalDaysToMonthStart = (month - 1) * 31;
console.log(totalDaysToMonthStart)
}
else {
totalDaysToMonthStart = 186 + ((month - 6 - 1) * 30);
console.log(totalDaysToMonthStart)
}
var remainedDayWithoutStartingDays = 7 - (totalDaysToMonthStart% 7);
var WeeksAfterStarting = Math.floor((this.getDaysInMonth() - remainedDayWithoutStartingDays) / 7);
console.log("remainedDayWithoutStartingDays: ", remainedDayWithoutStartingDays);
console.log("WeeksAfterStarting: ", WeeksAfterStarting)
return WeeksAfterStarting + (remainedDayWithoutStartingDays != 0)? 1:0;
};
PersianDate.prototype.getWeekFirstDay = function () {
var n = this.year;
var a = n - 1;
var b = a + 2346;
var yearLength = b * 365.24219879; //tool sal motevasete khorshidi
var c = Math.ceil(yearLength);
//نظر به آنکه مبداء سال ۲۳۴۶- روز سهشنبه بوده است (و با انتساب اعداد صفر و يک تا شش به شنبه و يکشنبه تا جمعه) به C سه واحد مىافزائيم يا از آن چهار واحد کم مىکنيم تا به مبداء شنبه انتقال يابيم و عدد حاصل را d مىناميم.
var d = c + 3;
var r = d % 7;
console.log("First day of year: " + r);
return r;
};
PersianDate.prototype.getDay = function () {
return this.day;
};
PersianDate.prototype.getWeekOfYear = function () {
console.log("Week of Year: " + this.getDayOfYear() + this.getWeekFirstDay() / 7);
return this.getDayOfYear() + this.getWeekFirstDay() / 7;
};
PersianDate.prototype.getWeekOfMonth = function () {
return undefined;
};
PersianDate.prototype.getDayOfWeek = function () {
return undefined;
};
PersianDate.prototype.getDayOfMonth = function () {
return undefined;
};
PersianDate.prototype.getDayOfYear = function () {
return undefined;
};
PersianDate.prototype.getMonth = function () {
return this.month;
};
PersianDate.prototype.getYear = function () {
return this.year;
};
return PersianDate;
})();
//# sourceMappingURL=PersianDate.js.map
var pd = new PersianDate(1395, 1, 1);
pd.getWeekFirstDay();
pd.getWeeksInMonth();
в первый день недели возвращаются от 0 до 6 (я не уверен, делают ли это стандартные даты или нет)
и проблема становится проблематичной - getWeeksInMonth:
сначала я заставил его работать, но через месяц с полным набором дней в первые недели он потерпел неудачу, затем я изменил его, теперь он вообще не работает. Я искал и не мог получить правильную формулу. (лучше скажи, что я вообще не получил никакой формулы)
что я должен сделать, чтобы вернуть недели в данном месяце:
на данную дату 1395/01 она должна быть похожа на изображение:
как вы можете видеть в пятом и одиннадцатом месяце у нас есть 6 недель в одном месяце, а остальные 5 дней. Надеюсь это исправить? У меня есть проблемы с неделями во все любопытные даты:'(
Спасибо.
ПРИМЕЧАНИЕ. Для тех, кто в будущем может посетить эту ветку, этот класс основан на PersianCalendar, а не на GregorianCalendar.
1 ответ
Конечно, это заняло много времени, так как кто-то помог мне решить эту проблему, а потом я забыл обо всем этом, но я создал репозиторий, поэтому важная формула здесь: