Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python | “万年历——日期查询”

Python | “万年历——日期查询”

作者头像
LogicPanda
发布于 2018-08-30 03:45:04
发布于 2018-08-30 03:45:04
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

图文编辑:逻辑熊猫 图片来源:网络与截图 欢迎朋友圈各种姿势转发

一个软件的关键在于

你想用它来做什么

一、功能描述

  • 查询日期如:wnl.py 2007/01/01
  • 显示月日历:wnl.py 2007/01

二、源代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sys import *

Weeks = ['Sun', "Mon", 'Tus', 'Wed', 'Thu', 'Fri', 'Sat']   
    
try :
    date_in = argv[1]
except:
    print('\n ERROR! you forgot to enter the date you want to view\n')
    date_in = input("Please input a date!\n > ")
    
# print(date_in)
year, month, day = date_in.split('/')
try :
    year, month, day = int(year), int(month), int(day)
except :
    year = int(year)
    month = int(month)
    day = 0

if month < 1 or month > 12:
    print('\n ERROR! the entered MONTH is invalid\n')
    exit()

# 判断闰年,同时得到d用来计算日差,m2为闰月标记
if year > 2000:
    d = (year-1-2000)//4-(year-1-2000)//100+(year-1-2000)//400+1
elif year == 2000:
    dy = 0
    m2 = 1
else:
    d = (year-2000)//4-(year-2000)//100+(year-2000)//400

dy=(year-2000)+d
if (year%4==0 and year%100 != 0) or (year%100==0 and year%400==0):
    m2 = 1
else:
    m2 = 0

# 为精简代码行数,使用下面格式
# 判断每月天数
if month == 1 : dm = 0; month = 31
elif month == 2 : 
    dm = 3
    if d == 1 :
        month = 29
    else:
        month = 28
elif month == 3 : dm = 3 + m2; month = 31
elif month == 4 : dm = 6 + m2; month = 30
elif month == 5 : dm = 1 + m2; month = 31
elif month == 6 : dm = 4 + m2; month = 30
elif month == 7 : dm = 6 + m2; month = 31
elif month == 8 : dm = 2 + m2; month = 31
elif month == 9 : dm = 5 + m2; month = 30
elif month == 10 :dm = m2;   month = 31
elif month == 11 :dm = 3 + m2; month = 30
elif month == 12 :dm = 5 + m2; month = 31
else:
    print("What is it?")

if day < 0 or day > month :
    print("\n Error! The entered Day is invalid\n")
    exit()

# 判断该日期为星期几,若参数为月,则用来判断该月第一天为星期几
week = (dy + dm + day - 1 + 6) % 7

if week < 0 :
    week += 7

if day > 0:
    if week == 0:   WEEK = Weeks[0]
    elif week == 1:  WEEK = Weeks[1]
    elif week == 2:  WEEK = Weeks[2]
    elif week == 3:  WEEK = Weeks[3]
    elif week == 4:  WEEK = Weeks[4]
    elif week == 5:  WEEK = Weeks[5]
    elif week == 6:  WEEK = Weeks[6]
    else:
        pass
    print("\n this day is ", WEEK, "(",int(week),")"+ "\n OK!\n")
else:
    week = (week+1) % 7
    # 格式化输出
    print("\n the calender of this month as following")
    print("\n ***************************************")
    print(" SUN  MON  TUR  WEN  THU  FRI  STA\n")
    for i in range(int(week)):
        print("    ", end = ' ')
    for i in range(1, month+1):
        print(" %2d "%i, end = ' ')
        if (week+1) % 7 == 0 and i != month :
            print("\n")
        week = week + 1
    print("\n****************************************\n")
    print("\n OK! \n")

三、代码拆解

  • 参数获取:
    • 如果想要从操作系统获取参数,需要使用sys模块。
    • 为使调试方便,增加了手动输入参数的功能,输入参数的格式应该正确,否则会报错
      • 如:2007/01/01
      • 或:2007/01/
    • 日期判断:
      • 使用了dy,dm等参数表示一年中的日差和一月中的日差。m2为闰月的标志以及作为一个日差来使用。
      • 使用到的公式:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
week = (dy + dm + day - 1 + 6) % 7
dy=(year-2000)+d
if year > 2000:
   d = (year-1-2000)//4-(year-1-2000)//100+(year-1-2000)//400+1
elif year == 2000:
   dy = 0
   m2 = 1
else:
   d = (year-2000)//4-(year-2000)//100+(year-2000)//400
  • 代码备注:
    • print()打印月日历时,将end设置为空格。否则会换行,每行仅剩一个数字
    • dm从每个月的判断中获得,由于python未提供switch相关的功能,这里只能使用if-elif-else格式
    • 为减少代码行数,使用“;”使一行中可以写下多个语句
    • 该程序中基本年为2000年。

四、笔者评述

这是一个简单小程序,从这个程序说明,对于编程而言,有一定的数学基础是比较重要的,除此之外锻炼逻辑思维能力可以提高编程能力。

从实用性角度来讲,这并不是一个有用的程序,但是作为学习,是非常不错的。

代码的优化力度不大,但是可优化空间很大,这是一个简单的实现,从操作性上来讲,比较头疼,比如,不能连续查询,对参数格式比较依赖等。

五、思考

关于此代码的不足,请读者们在学习或者作为积累代码库的时候,尝试修改代码,比如给代码添加连续查询功能,让参数的格式变得自由,或者给程序带上参数,增加新的功能等。

六、结尾

功能简介:领域包括了「面向 Python 基础,进阶和有趣应用」的一站式技术分享,挖掘学习者在学习当中遇到的各类问题并分享经验,关注实用技能和有趣新闻,感兴趣的推荐关注。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逻辑熊猫带你玩Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
万年历matlab算法,万年历算法(万年历算法和分析)[通俗易懂]
用蔡勒(Zeller)公式 即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡.
全栈程序员站长
2022/07/22
1.7K0
用Python制作万年历
所谓万年历,就是咱们电脑或者手机的日期会记录每个月每天对应星期几。用python来制作万年历,就是从键盘输入年份和月份,然后输出对应的日历表。
算法与编程之美
2023/12/13
4210
用Python制作万年历
C语言实现简单的万年历
最近在回顾学习C语言时一些想做但没去做的练手小玩意,并且尽量不用一些便利的库函数以此来巩固基础
晨星成焰
2024/05/07
1910
C语言实现简单的万年历
Java_万年历(简单)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155342.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/06
7260
Java_万年历(简单)
设计分享|基于51单片机的万年历(汇编)
实现年、月、日、时、分、秒、农历的显示,例如:如图显示的是2001年1月1日,农历12月7日,00点01分23秒。
电子工程师成长日记
2022/07/27
1K1
设计分享|基于51单片机的万年历(汇编)
java实现万年历[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155272.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/06
1.3K0
java实现万年历[通俗易懂]
用C语言写的万年历---亲手写的。好累哦
#include <stdio.h> #include <stdlib.h> #include <string.h> #define str "   SUN   MON  TUE   WED   THU   FRI   SAT   " void menu();         //操作菜单 int leap(int year);        //判断某年是不是闰年 int days_month(int year,int month);        //返回某月的天数 int someday(in
marsggbo
2018/01/23
1.4K0
java万年历算法_寿星万年历—java算法实现
寿星万年历是我在网上见到的一份极高高精度的万年历,其采用先进的算法实现,其精度堪比刘安国教授为中国科学院国家授时中心制作的日梭万年历。但网络上只有javascript版本。于是自己将其翻译为java程序,并公布于此,方便大家使用。
全栈程序员站长
2022/07/23
1.2K0
日期类相关练习题
本文记录一些有关日期类的oj题题解,实现过日期类小项目的可以练一下手,本文不做过多讲解.
初阶牛
2023/10/14
1830
python生成全年日期表
#!usr/bin/env python # encoding:utf-8 # from __future__ import division import requests import json from dateutil.relativedelta import relativedelta import math import logging import os import sys # from datetime import datetime from odps import ODPS,Dat
chimchim
2022/11/13
7870
python开发_calendar
如果你用过linux,你可能知道在linux下面的有一个强大的calendar功能,即日历
Hongten
2018/09/13
7260
Python 日期和时间用法超强总结
时间无疑是生活各个方面中最关键的因素之一,因此,记录和跟踪时间变得非常重要。在 Python 中,可以通过其内置库跟踪日期和时间。今天我们来介绍关于 Python 中的日期和时间,一起来了解如何使用time和datetime模块查找和修改日期和时间。
可以叫我才哥
2022/11/11
5010
万年历信息获取的Python代码
》一文中提到过,中国特色的调休会导致很多的周分析失效,因此我们可以通过爬取调休信息来进行修正。
陈学谦
2020/06/10
1.3K0
万年历信息获取的Python代码
[漫谈C++|实践]C++ 万年历项目实践:深入探索语言特性与系统级编程
C++,作为一门广泛应用于系统级编程和性能优化的编程语言,在软件开发领域有着深厚的历史和强大的实力。近期,Embarcadero发布了 RAD Studio 12 Athens,其中包含了对 C++ 的一系列更新,引入了 Visual Assist 的集成以及对基于 Clang 的 C++ 编译器的显著更新。这些变化为使用 C++ 进行项目开发提供了更多的工具和特性。在这篇博客中,我们将结合这些最新资讯,分享一次使用 C++ 完成万年历项目的开发实践之旅。
数字扫地僧
2023/11/28
4470
Contest100000578 – 《算法笔记》3.4小节——入门模拟->日期处理
http://codeup.cn/contest.php?cid=100000578 Problem A: 日期差值 Time Limit: 1.000 Sec Memory Limit: 32 M
可定
2020/04/20
4370
冲击蓝桥杯-时间问题(必考)
时间问题可以说是蓝桥杯,最喜欢考的问题了,因为时间问题不涉及到算法和一些复杂的知识,往往时间复杂度也不是很高,可以很好的考察学生的模拟和枚举思想,这类题目通常也可以巧用excel来帮助我们解决问题。近几年的考试考察难度也在增大。
莫浅子
2023/03/24
7260
冲击蓝桥杯-时间问题(必考)
LeetCode 1360. 日期之间隔几天(闰年判断)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-of-days-between-two-dates 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2020/07/13
9020
万年历——ASP.NETCORE写法
这个是从实际2023年2月的日历,与咱们遍历的是一致的,计算好对应的星期起始很重要。
红目香薰
2023/05/02
7120
万年历——ASP.NETCORE写法
Python处理日期方法大全、三十种方法
Python学习者
2023/12/12
2210
java生成html万年历
package Str; import java.util.Calendar; /** * * * @project Tool * @type Test8 * @Description * @author xuyw * @email xyw10000@163.com * @date 2014-8-9 下午01:45:02 * @version 1.0 * */ public class Test8 { /** * @par
用户7705674
2021/09/24
9890
相关推荐
万年历matlab算法,万年历算法(万年历算法和分析)[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验