【发布时间】:2020-10-20 18:19:01
【问题描述】:
我正在尝试实施一个有 13 个月的非公历。我使用了两个函数来做到这一点。其中之一
generateCalendar 用于为每个月创建一个以工作日为索引的日历矩阵
function generateCalendar(type = 'en') {
var [etYear, etMonth, etDate] = Ethiopic.toEthiopian(
state.activeDate.getFullYear(),
state.activeDate.getMonth() + 1,
state.activeDate.getDate(),
);
console.log('Month: ', etMonth);
var enYear = state.activeDate.getFullYear();
var enMonth = state.activeDate.getMonth();
var matrix = [];
if (type == 'en') {
matrix = [];
var firstDay = new Date(enYear, enMonth, 1).getDay();
var maxDays = enCalendar.en_days[enMonth];
if (enMonth == 1) {
if ((enYear % 4 == 0 && enYear % 100 != 0) || enYear % 400 == 0) {
maxDays += 1;
}
}
matrix[0] = enCalendar.en_weekDays;
var counter = 1;
for (var row = 1; row < 7; row++) {
matrix[row] = [];
for (var col = 0; col < 7; col++) {
matrix[row][col] = -1;
if (row == 1 && col >= firstDay) {
matrix[row][col] = counter++;
} else if (row > 1 && counter <= maxDays) {
matrix[row][col] = counter++;
}
}
}
} else if (type == 'et') {
matrix = [];
var startDayOfYear = Ethiopic.startDayOfEthiopian(etYear);
// var firstDay = startOfYear + (30 % startDayOfYear);
var firstDayOfYear = new Date(enYear, 8, startDayOfYear).getDay();
var firstDay =
(etMonth - 1) * 2 + firstDayOfYear > 7
? ((etMonth - 1) * 2 + firstDayOfYear) % 7
: (etMonth - 1) * 2 + firstDayOfYear;
var maxDays = etCalendar.et_days[etMonth - 1];
console.log(maxDays);
if (etMonth == 13) {
if (etYear % 4 == 3) {
maxDays += 1;
}
}
matrix[0] = etCalendar.et_weekDays;
var counter = 1;
for (var row = 1; row < 7; row++) {
matrix[row] = [];
for (var col = 0; col < 7; col++) {
matrix[row][col] = -1;
if (row == 1 && col >= firstDay) {
matrix[row][col] = counter++;
} else if (row > 1 && counter <= maxDays) {
matrix[row][col] = counter++;
}
}
}
}
return matrix;
}
另一个是changeMonth,它增加一个月并改变状态,从而创建一个新矩阵。
function changeMonth(n) {
setState({
activeDate: new Date(state.activeDate.setMonth(state.activeDate.getMonth() + n))
});
}
这里的问题是埃塞俄比亚历有 13 个月,所以我不能使用 setmonth 并增加或减少它并转换回埃塞俄比亚历,因为 activeDate 决定了公历的月份数为 12。所以 setmonth 在 11 之后重置,并且只工作 12 个月
但是由于埃塞俄比亚历中的每个月都是 30 天,除了最后一个月有 5 天或 6 天,我想让它在增加或减少月份时循环通过月份,也许然后我可以转换回公历并设置活动日期。
【问题讨论】:
-
您可以考虑利用 toLocaleString 的功能来使用不同的日历,例如科普特日历中的今天日期由:
new Date().toLocaleString('en-GB-u-ca-coptic')给出。 Date.prototype 的 month 和 year 函数是基于公历的,对于任何其他日历,您必须自己弄清楚. :-) -
有没有办法扩展 Date.prototype 让它可以多出一个月?
-
是的,但这不是一个好主意。
标签: javascript reactjs react-native date