在linux中用vim写日历函数,基本功能有:
- 输入月和年,输出日历
- 如果不输入月,但有年,则输出1-12月日历
- 如果都不输入,则输出当前日历
- 如果输入月,但不输入年,则默认今年
vim own_cal.py
import datetime
def first_day(m, y):
# 计算出公式中需要的m, y, c
if m == 1 or m == 2:
m += 12
y -= 1
c = y // 100
y %= 100
# 计算并返回每月第一天是星期几
return (y + y//4 + c//4 - 2 * c + 26 * (m+1) // 10) % 7
def is_leap_year(y):
# 判断闰年
return 1 if (y % 100 != 0 and y % 4 == 0) or (y % 400 == 0) else 0
def total_days(m, isleap):
# 判断天数
return 31 if m in [1, 3, 5, 7, 8, 10, 12] else (
isleap + 28 if m == 2 else 30
)
def get_cal(first_day, total_days):
# 创建cal列表
cal = ['日', '一', '二', '三', '四', '五', '六']
# 获得日历第一排的空格数
for i in range(first_day):
cal.append(' ')
# 获得剩余的日期
for i in range(1, total_days + 1):
cal.append(f'{i: <2}')
return cal
def draw_cal(cal):
# 创建计数变量t
t = 0
for i in cal:
# t是7的倍数时换行,其他时候空格
print(f'\n{i}', end='') if t % 7 == 0 else print(f' {i}', end='')
t += 1
print('\n')
def cal_main(m, y):
f_day = first_day(m, y)
isleap = is_leap_year(y)
t_days = total_days(m, isleap)
cal = get_cal(f_day, t_days)
print(f'{y: >7}年{m:0>2}月日历')
draw_cal(cal)
if __name__ == '__main__':
m = input('请输入月份: ')
y = input('请输入年份: ')
now_date = datetime.datetime.now()
# 如果m、y都空着就按当前月算, 如果只有m空着就按1-12月算
m_list = [now_date.month] if m + y == '' else(
range(1, 13) if m == '' else [int(m)]
)
# 如果y空着就按今年算
y = now_date.year if y == '' else int(y)
for m in m_list:
cal_main(m, y)
ESC
shift + :wq