【发布时间】:2021-09-20 13:58:18
【问题描述】:
我正在尝试标记照片中显示的日期。第一个星期日过去后,标记的数字达到 20 多岁。过了第 2 个星期日后,标注的数字达到 30 多岁。后面的数字代表星期几。例如。 25 代表每月的第二个星期五。
关于如何创建此逻辑的任何建议?
【问题讨论】:
-
所以要明确一点:每个标签都是两位数,其中第一位是周数,第二位是星期几(从星期一开始)?
-
是的,没错
我正在尝试标记照片中显示的日期。第一个星期日过去后,标记的数字达到 20 多岁。过了第 2 个星期日后,标注的数字达到 30 多岁。后面的数字代表星期几。例如。 25 代表每月的第二个星期五。
关于如何创建此逻辑的任何建议?
【问题讨论】:
您可以使用DateTime 类实现此目的。我添加了一个示例实现,您可以进一步优化:
// Function that maps day with corresponding value
Map<int, int> generateMap(DateTime firstDateOfMonth) {
final map = <int, int>{};
final numOfDays = getNumberOfDaysInMonth(firstDateOfMonth);
int weekDay = firstDateOfMonth.weekday;
int sunday = (7 - weekDay) + 1;
int week = 1;
for (int i = 1; i <= numOfDays; i++) {
if (sunday < i) {
weekvv += 1;
sunday += 7;
weekDay = 1;
}
map[i] = (week * 10) + weekDay;
weekDay++;
}
return map;
}
// Returns Number of days in a month
int getNumberOfDaysInMonth(DateTime date) {
int numOfDays = 0;
switch (date.month) {
case DateTime.january:
case DateTime.march:
case DateTime.may:
case DateTime.july:
case DateTime.august:
case DateTime.october:
case DateTime.december:
numOfDays = 31;
break;
case DateTime.april:
case DateTime.june:
case DateTime.september:
case DateTime.november:
numOfDays = 30;
break;
case DateTime.february:
isLeapYear(date) ? 29 : 28;
break;
}
return numOfDays;
}
// Checks whether the year is Leap Year
bool isLeapYear(DateTime date) => date.year % 4 == 0;
您可以传递该月的第一天来生成该特定月份的映射:
final now = DateTime.now();
final firstDayOfMonth = DateTime(now.year, now.month);
print(generateMap(firstDayOfMonth));
对于当前月份(2021 年 9 月),它会打印出以下输出:
{
1: 13, 2: 14, 3: 15, 4: 16, 5: 17,
6: 21, 7: 22, 8: 23, 9: 24, 10: 25,
11: 26, 12: 27, 13: 31, 14: 32, 15: 33,
16: 34, 17: 35, 18: 36, 19: 37, 20: 41,
21: 42, 22: 43, 23: 44, 24: 45, 25: 46,
26: 47, 27: 51, 28: 52, 29: 53, 30: 54
}
【讨论】: