如何在Dart中实现按规则为每个日期生成对应标签的逻辑
日期标签生成逻辑实现方案
规则前置梳理
先明确规则的无歧义拆解:
- 十位规则:
- 当月首日至第一个周日结束前,标签十位为
1(对应10~17段) - 第一个周日结束后至第二个周日结束前,标签十位为
2(对应20~27段) - 第二个周日结束后至第三个周日结束前,标签十位为
3(对应30~37段) - 以此类推,每过完一个完整周日,十位数值+1
- 当月首日至第一个周日结束前,标签十位为
- 个位规则:
- 星期一对应
1、星期二对应2……星期日对应7,直接作为标签个位 - 示例:25对应20段(第一个周日后的周期)的星期五,和题目给出的示例完全匹配
- 星期一对应
通用实现步骤(可适配任意编程语言)
- 提取输入日期的三个基础值:年份、月份、当月第几天
- 计算输入日期对应的星期数值,统一映射为1~7的范围(1=周一,7=周日)
- 计算当月第一个周日的日期:
- 先算当月1号对应的星期数值w
- 第一个周日的日期 = 1 + (7 - w) % 7
- 计算标签的十位数值:
- 若当前日期 ≤ 第一个周日的日期,十位=1
- 若当前日期 > 第一个周日的日期,十位=2 + ((当前日期 - 第一个周日的日期 - 1) // 7)
(减1是为了将第一个周日后的周一到周日整个自然周归到同一个十位段)
- 最终标签值 = 十位 * 10 + 星期数值
代码示例(Python)
import datetime def generate_date_tag(date: datetime.date) -> int: # 转换星期数值:datetime的weekday()返回0=周一、6=周日,映射为1~7 weekday_num = date.weekday() + 1 # 取当月1号的星期数值 first_day = datetime.date(date.year, date.month, 1) first_day_week = first_day.weekday() + 1 # 计算当月第一个周日的日期 first_sunday = 1 + (7 - first_day_week) % 7 # 计算十位 if date.day <= first_sunday: tens = 1 else: tens = 2 + ((date.day - first_sunday - 1) // 7) # 拼接返回结果 return tens * 10 + weekday_num # 测试用例 if __name__ == "__main__": # 2024年5月1号为周三,5号为当月第一个周日 test1 = datetime.date(2024,5,5) # 当月第一个周日 print(generate_date_tag(test1)) # 输出17,符合10段周日的规则 test2 = datetime.date(2024,5,6) # 第一个周日之后的周一 print(generate_date_tag(test2)) # 输出21,符合20段周一的规则 test3 = datetime.date(2024,5,10) # 第一个周日之后的周五 print(generate_date_tag(test3)) # 输出25,完全匹配题目给出的示例
边界场景验证
- 当月1号刚好是周日:第一个周日为1号,当天标签为17,2号周一直接进入20段,标签为21,符合规则
- 当月有5个周日:第四个周日结束后十位自动变为5,生成51~57的标签,逻辑依然适用
内容的提问来源于stack exchange,提问作者scott lee
相关产品推荐
相关产品推荐

