You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用嵌套循环打印日历 实现月份首日对应星期位置偏移

问题

需要实现命令行日历生成程序,流程为:

  • 提示用户输入目标月份的总天数
  • 提示用户输入该月1号对应的星期值
  • 输出排版对齐正确的月历
    当前已完成日期遍历打印的逻辑,但无法实现首日位置偏移,1号始终从第一列开始输出,无法对齐到周二、周四等非周日的起始星期,现有代码如下:
days = int(input('Enter number of days: '))
day_of_week = input('The first day of the week: ')
print('S M T W TH F S')

if days == 31:
    for x in range(1, 32):
        print(x, end = ' ')
        if x%7==0:
            print('\n')
            
else:
    for x in range(1, 31):
        print(x, end = ' ')
        if x%7==0:
            print('\n')

现有代码除了偏移逻辑缺失,还存在三个明显问题:

  • 天数判断逻辑不全,仅处理了30、31天的月份,2月28/29天的场景会多打印无效日期
  • 换行逻辑仅判断日期是否为7的倍数,加入偏移后排版会完全错乱
  • 输入的首日星期值没有做数值转换,无法参与排版计算
解决方法

核心偏移逻辑非常直接:按照表头S M T W TH F S的列顺序,给每个星期值分配0-6的偏移量,打印日期前先输出对应数量的空白占位,把1号推到正确的列位置,之后正常遍历打印日期即可,每累计打印7个内容(包含前置空白占位)就换行,就能保证排版正确。

修正后的完整可运行代码:

# 星期值到列偏移量的映射,和表头顺序一一对应
# SU=周日, M=周一, T=周二, W=周三, TH=周四, F=周五, SA=周六
offset_map = {
    'SU': 0,
    'M': 1,
    'T': 2,
    'W': 3,
    'TH': 4,
    'F': 5,
    'SA': 6
}

# 获取用户输入
total_days = int(input('Enter number of days: '))
first_weekday = input('Enter first weekday (SU/M/T/W/TH/F/SA): ').strip().upper()
leading_space = offset_map[first_weekday]

# 打印日历表头,每列固定3字符宽度保证对齐
print('S  M  T  W  TH F  S')

# 打印前置偏移空白,把1号推到对应列
print('   ' * leading_space, end='')

# 遍历打印所有日期,记录当前所在列数
current_col = leading_space
for day in range(1, total_days + 1):
    # 日期固定占3字符宽度,避免个位数/两位数长度错位
    print(f'{day:<3}', end='')
    current_col += 1
    # 每打印满7列就换行
    if current_col % 7 == 0:
        print()

# 日历最后一行未满7列时补换行,优化输出格式
if current_col % 7 != 0:
    print()
逻辑说明
  • 偏移实现:不需要修改日期遍历逻辑,只要在打印1号前输出对应数量的3字符宽空白,就能实现首日位置对齐,逻辑简单不易出错
  • 对齐处理:所有空白占位、日期输出统一使用3字符宽度,和表头列宽匹配,不会出现列错位
  • 通用性:直接使用用户输入的总天数作为遍历终止条件,不需要单独判断28/29/30/31天的月份,适配所有月份场景
  • 换行逻辑:从偏移量开始累计列数,每满7列就换行,不管当前日期是不是7的倍数,偏移场景下也能保证每行严格7列的排版

内容的提问来源于stack exchange,提问作者user19198861

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:06:51