荒废了两个星期没学java了,今天一心想突破"日历查询"这个小程序。先用比较简单的python实现下。

无奈天资愚钝,想了一个上午。最后卡在了日期排列的问题上,只好去参考下别人的代码。

参考CSDN大牛: http://blog.csdn.net/jlshix/article/details/46970563

从简单的开始,想想既然是查询日历。打开下手机,大体是这种模样。那么我们就按照这种格式,来

设计程序吧。

首先,之前讲到的,用(%)求余符号求星期的。今天是10月30号—周日,那么如何求出若干天后是星

期几呢? 思路就是,我们把周日定为0,一天后的周一自然就是1,依此类推,周六就是六啦。那么13

天后,就是(0+13) % 7 = 5, 周五哦......

 # coding: utf-8

 print u"今天是周日!"
query = raw_input(">>> ") weeks = {
0: u"周日",
1: u"周一",
2: u"周二",
3: u"周三",
4: u"周四",
5: u"周五",
6: u"周六",
} print query + u"天后是" + weeks[(int(query) + 0) % 7]

------------------------------------------------------------------------------------------------------------------------------------------------------------

现在就利用之前做过的自动关机脚本的原理,以1970年1月1日午夜零点,也就是周四为基点。来算出从它

到现在总共过了多少秒,然后再转化为总共多少天,再算出若干天之后是星期几。

【注: 2016年10月31号是周一】

 # coding: utf-8

 import time
import datetime
#--------------------------------------------#
# 把当前的时间转化为指定格式 "年/月/日 时:分:秒" #
# 把当前时间转化为datetime.datetime的类型 #
# 得出从1970年元旦0点至今的总秒数 #
# 再将总秒数转化为总天数 #
#---------------------------------------------#
currTime = time.strftime("%Y/%m/%d %H:%M:%S")
dt = datetime.datetime.strptime(currTime, "%Y/%m/%d %H:%M:%S")
currSeconds = time.mktime(dt.timetuple())
currDays = currSeconds / (3600 * 24) weeks = {
0: u"周日",
1: u"周一",
2: u"周二",
3: u"周三",
4: u"周四",
5: u"周五",
6: u"周六"
} print weeks[int((currDays + 4) % 7)]

--------------------------------------------------------------------------------------------------------------------------------------------------------------

其实嘛,这个小程序的难点就在于日历日期的排版上。大家可以看出来,除了第一行和最后一行,每一行都是有七个数。

所以重点就在于找出第一个数字也就是每个月的1号到底是周几。然后根据0对应周日,1对应周一等等按空格排列。从第

一个数字的空格情况上可以推断。周六的话,距离行开头有5 * 6个空格,加上开头的三个空格。(一二三这些中文分别占

两个空格,字与字之间隔三个空格。)对于1之后的其它数字,都是"4d"占有四个空格(包括其自身)的位置。所以这个开头

的三个空格是不能省略的。

 # coding: utf-8

 import time
import datetime # 格式化日期: %Y表示年, %m表示月, %d表示日
# 注意将字符串型(string)转换成整数型(int)
year = int(time.strftime("%Y"))
month = int(time.strftime("%m"))
day = int(time.strftime("%d")) #--------------------------------------------#
# 当前时间 #
# 把当前时间转化为datetime.datetime对象 #
# 自1970年1月1日以来到今天总共过了多少秒 #
# 直至今天总共过了多少天 #
# 直至当月的1号总共过了多少天 #
#--------------------------------------------#
currTime = time.strftime("%Y/%m/%d %H:%M:%S")
dt = datetime.datetime.strptime(currTime, "%Y/%m/%d %H:%M:%S")
totalSeconds = time.mktime(dt.timetuple())
totalDays = totalSeconds / (3600 * 24)
start_day = int(totalDays -int(day) + 1) index = (4 + start_day) % 7 def is_leap_year(year):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
else:
return False def get_num_of_days_in_month(year, month):
if month in (1, 3, 5, 7, 8, 10, 12):
return 31
elif month in (4, 6, 9, 11):
return 30
elif is_leap_year(year):
return 29
else:
return 28 def print_calender(year, month):
# 打印日历正文
# print + 逗号会多一个空格
print u" < %s年%s月" % (year, month)
print "-----------------------------------"
print u" 日 一 二 三 四 五 六" for i in range(1, get_num_of_days_in_month(year, month) + 1):
if i == 1:
print " ", # 打印行首的三个空格
print " " * 5 * index + "%d" % 1, # 从星期几开始则空几个空格
else:
print "%4d" % i, # 宽度控制, 4 + 1
if (4 + start_day + i - 1) % 7 == 6:
print # 当日期转到周六时换行 print_calender(year, month)

查询当月日历

上面这种是用到time 和 datetime 模块的,日期要转换为时间戳,稍显麻烦。所以下面我们用另一种直接计算天数的,

并且定义了多个函数,相信模块化的形式会更加便于理解。

 # coding: utf-8

 import time

 # 将日期格式化成字符串(string), 注意转换成整数型(int)
year = int(time.strftime("%Y"))
month = int(time.strftime("%m")) def is_leap_year(year):
# 判断是否闰年
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
else:
return False def get_num_of_days_in_month(year, month):
# 每个月有多少天, 闰年和平年的2月(平月)分别是29和28天
if month in (1, 3, 5, 7, 8, 10, 12):
return 31
elif month in (4, 6, 9, 11):
return 30
elif is_leap_year(year):
return 29
else:
return 28 def get_total_days(year, month):
# 自从1970年1月1日以来过了多少天
days = 0 for y in range(1970, year):
if is_leap_year(y):
days += 366
else:
days += 365
for m in range(1, month):
days += get_num_of_days_in_month(year, m) return days def get_start_day(year, month):
# 返回每个月的1号是星期几
return (4 + get_total_days(year, month)) % 7 def print_calender(year, month):
# 打印日历正文
print u" < %s年%s月" % (year, month)
print "-----------------------------------"
print u" 日 一 二 三 四 五 六"
for i in range(1, get_num_of_days_in_month(year, month) + 1):
if i == 1:
print " " + " " * 5 * get_start_day(year, month) + "%d" % 1,
else:
print "%4d" % i,
if (get_start_day(year, month) + i - 1) % 7 == 6:
print print_calender(year, month)

改进版

-------------------------------------------------------------------------------------------------------------------------------------

接下来是终极版的日历,只能查询当月的日历,实用性大打折扣。所以我们要能查到所有年份所有月份的日历,这才好玩!

 # coding: utf-8

 import re  # 导入正则表达式re: (regex)
import time # 输入日期, 2016/11或2016-11或2016 11的格式均可
# 用re.findall匹配所有数字, 并以列表的形式保存
date = raw_input(u"请输入您想要查询的日期: ".encode("gbk"))
date_list = re.findall("\d+", date)
year = int(date_list[0])
month = int(date_list[1]) def is_leap_year(year):
# 判断是否闰年
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
else:
return False def get_num_of_days_in_month(year, month):
# 返回各个月的天数
# 注意: 闰年和平年的2月(平月)分别是29和28天
if month in (1, 3, 5, 7, 8, 10, 12):
return 31
elif month in (4, 6, 9, 11):
return 30
elif is_leap_year(year):
return 29
else:
return 28 def get_total_days(year, month):
# 得出自1970年1月1日到指定日期的天数
total_days = 0
for y in range(1970, year):
if is_leap_year(y):
total_days += 366
else:
total_days += 365
for m in range(1, month):
total_days += get_num_of_days_in_month(year, m)
return total_days def get_start_day(year, month):
# 得出每个月的1号是星期几
return (4 + get_total_days(year, month)) % 7 def print_calender(year, month):
# 打印日历正文
# print + 逗号会多出一个空格
print u" < %s年%s月" % (year, month)
print "------------------------------------"
print u" 日 一 二 三 四 五 六"
# 索引上限记得加1
for day in range(1, get_num_of_days_in_month(year, month) + 1):
if day == 1:
print " " + " " * 5 * get_start_day(year, month) + "%d" % 1,
else:
print "%4d" % day,
if (get_start_day(year, month) - 1 + day) % 7 == 6:
print print_calender(year, month)

查询任意月份的日历

11月

10月

2月

--------------- 11.2号早

【Time系列四】查询各月份的日历的更多相关文章

  1. 转:arcgis api for js入门开发系列四地图查询

    原文地址:arcgis api for js入门开发系列四地图查询 arcgis for js的地图查询方式,一般来说,总共有三种查询方式:FindTask.IdentifyTask.QueryTas ...

  2. MyBatis系列四 之 智能标签进行查询语句的拼接

    MyBatis系列四 之 智能标签进行查询语句的拼接 使用Foreach进行多条件查询 1.1 foreach使用数组进行多条件查询 在MyBatis的映射文件中进行如下配置 <!--根据数组进 ...

  3. S5PV210开发系列四_uCGUI的移植

    S5PV210开发系列四 uCGUI的移植 象棋小子          1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...

  4. struts2官方 中文教程 系列四:Action

    先贴个本帖的地址,免得其它网站被爬去了struts2教程 官方系列四:Action  即 http://www.cnblogs.com/linghaoxinpian/p/6905521.html 下载 ...

  5. Bing Maps进阶系列四:路由功能服务(RouteService)

    Bing Maps进阶系列四:路由功能服务(RouteService) Bing Maps提供的路由功能服务(RouteService)可以实现多方位的计算地图上的路线指示,路径行程等功能,比如说实现 ...

  6. 爬虫系列(四) 用urllib实现英语翻译

    这篇文章我们将以 百度翻译 为例,分析网络请求的过程,然后使用 urllib 编写一个英语翻译的小模块 1.准备工作 首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器 ...

  7. Elasticsearch使用系列-基本查询和聚合查询+sql插件

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...

  8. 前端构建大法 Gulp 系列 (四):gulp实战

    前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...

  9. Sql Server来龙去脉系列之三 查询过程跟踪

    我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更 ...

随机推荐

  1. 实现 ready和bind事件

    Jquery揭秘系列:实现 ready和bind事件   讲这一节之前,先回顾之前的一篇<小谈Jquery>里面的代码: (function (win) { var _$ = functi ...

  2. facebook .net sdk 应用

    浅谈 facebook .net sdk 应用   今天看了一篇非常好的文章,就放在这里与大家分享一下,顺便也给自己留一份.这段时间一直在学习MVC,另外如果大家有什么好的建议或者学习的地方,也请告知 ...

  3. 企业架构与建模之Archimate视图和视角

    企业架构与建模之Archimate视图和视角 3. ArchiMate的视角与视图 创建.维护一个企业架构是一件非常复杂繁琐的事情,因为这项工作需要面对许多背景.利益各异的干系人,对他们所关注的问题进 ...

  4. iOS 监听声音按键

    有时在项目中需要监听用户是否按下了物理声音键,然后来做某些操作,如:你自定义了一个照相功能,希望用户按下声音按键时也能进行拍照,苹果自带的照相机就有这种功能. 监听物理声音键是否按下的方法有很多中,我 ...

  5. SQL Server 2008 维护计划实现数据库备份

    SQL Server 2008 维护计划实现数据库备份(最佳实践) 2013-08-29 09:08 by 听风吹雨, 173 阅读, 2 评论, 收藏, 编辑 一.背景 之前写过一篇关于备份的文章: ...

  6. JUC.Condition学习

    JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...

  7. 在多线程中进行UI操作--ios学习笔记

    iOS 上不建议在非主线程进行UI操作,在非主线程进行UI操作有很大几率会导致程序崩溃,或者出现预期之外的效果. 我开始不知道这一点,在子线程中进行了弹窗操作,结果程序就出问题了! 报的错误是(EXC ...

  8. 里氏替换原则LSP(继承规范)

    继承的优点: 1.代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性. 2.提高代码的重用性. 3.子类可以形似父类,但又异于父类. 4.提高代码的可扩展性,实现父类的方法就可以“为所欲为” ...

  9. ASP.NET Web API的消息处理管道:"龙头"HttpServer

    ASP.NET Web API的消息处理管道:"龙头"HttpServer 一般来说,对于构成ASP.NET Web API消息处理管道的所有HttpMessageHandler来 ...

  10. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...