Python实现的学历与日历互转

背景:学历是指大学中常用的“第X周周X”这种日期格式,日历是指我们常用的公历。大学生活中难免会遇到这两种日期的转换问题,以前我都是看着万年历自己数的,今天在课程格子中添加下学期的一大坨考试安排(教务处课表上用的是学历,而课程格子中只支持日历)时,累觉不想再手动数了,于是花了比数数更长的时间写了一个简单的Python小程序,用到了datetime中的date类和timedelta类,也算是掌握了一个现成的小工具,不用自己再去写日期类了。只是随便写了一下给自己临时用的,用户体验、程序流程和逻辑什么的都没太在意。在这儿记录一下好了,以备将来用到。

#-*- coding: utf-8 -*-
"""
根据开学日期,实现”第X周周X“和”年月日“的互转
"""

import datetime

print "请输入开学日期(yyyy-mm-dd),不输入则默认为2014-09-08星期一:"
start = raw_input()
if start == '':
    start = datetime.date(2014, 9, 8)   # 开学日期
else:
    start = start.split('-')
    start = datetime.date(int(start[0]), int(start[1]), int(start[2]))
print "开学这天是"+start.__str__()+",星期"+str(start.weekday()+1)
while True:
    print "学历转日历:"
    print "请输入要查询的周数(输入-1结束):"
    week = eval(raw_input())
    if week == -1:
        break
    print "请输入要查询的是星期几:"
    day = eval(raw_input())
    print "这天的具体日期是:"+(start+datetime.timedelta(days = (week-1)*7 + day - start.weekday() - 1)).__str__()
while True:
    print "日历转学历:"
    print "请输入要查询的日期(yyyy-mm-dd,不输入则结束):"
    query = raw_input()
    if query == '':
        break
    query = query.split('-')
    query = datetime.date(int(query[0]), int(query[1]), int(query[2]))
    print "这天是第" + str(1 + ((query - start).days + start.weekday())/7) + "周,星期" + str(query.weekday() + 1)

解释:
运行环境为Python 2.7。编码格式为UTF-8。
datetime,date,timedelta都是需要import datetime这个类包才可以用的。
初始化一个date类的方法:datetime.date(year, month, day)。
初始化一个timedelta对象的方法:datetime.timedelta([days = [, hours = [, seconds = ]]])。这里是用days初始化的。
date对象支持重载的+、-运算符,两个date相减可以得到一个timedelta对象。date对象可以和timedelta对象用运算符+相加,得到一个date对象。
date类有一个方法date.weekday(),返回该日期是星期几(星期一是0,星期二是1,…,星期天是6)。
date.__str__():内建方法,返回该日期对应的yyyy-mm-dd格式的字符串。