批处理万年历实现代码(包括农历日期)

核心源码

:: 月历查询工具 最初发表于CN-DOS
:: 原创:foxjl 更新:namejm, qzwqzw,foxjl
:: 计算农历日期部分思路及算法来自"趣味东"
:: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
:: 在日历里面,★=当天
:: 支持多种格式的日期输入:
:: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上;
:: ② 若输入两个数,则认为是查询年和月,★标在1日上;
:: ③ 输全的话,★标在指定日期上
:: 关于年份的转换:
:: ① 若年份上输入的数字少于三位,则作如下转换:
::   50~99判定为19xx
::   0~49判定为20xx
:: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
::  按 ① 的规则计算该年份的日期;
:: 07-08-04 增加针对阳历的生肖及干支年计算;修改错误日期循环提示的BUG.
:: 08-01-13 增加推算农历日期的功能,会有一天左右误差。
@echo off
color 1f
mode con cols=40 lines=20
setlocal enabledelayedexpansion
set str=日一二三四五六七八九
set sdate=%date%
:Main
cls&echo.
:: 日期提取、格式化与校验
for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do (
  (set sy=%%i) && (set sm=%%j) && (set sd=%%k)
)
if not defined sd set sd=1
if not defined sm set sm=%sy%&set sy=%date:~0,4%
(set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
(set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
if errorlevel 9167 goto Error
if %y% lss 100 (
  if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
  set sy=!y!
)
if %m% lss 13 if %d% lss 32 goto Calc
:Error
echo.错误的日期.
pause>nul
cd.
set sdate=%date%
goto Main
:Calc
::计算农历部分
set/a Q=(y-1901)/4
set/a R=y-1901-4*Q
set n=0
for %%i in (0,31,59,90,120,151,181,212,243,273,304,334) do (
set /a n+=1
if %m% equ !n! set z=%%i)
set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
if %m% gtr 2 (if %leap% equ 0 (set /a z-=1) else (set /a z+=leap))
set/a n=(140*Q+106*(R+1)+z*10+d*10)/295,H=(140*Q+106*(R+1)+z*10+d*10-295*n)/10
if %h% equ 0 set h=29
if %h% leq 10 (if %h% equ 10 (set h=初十) else (set h=初%h%)) else (set h=%h:~0,1%十%h:~-1%号)
for /l %%i in (1,1,9) do (call set h=%%h:%%i=!str:~%%i,1!%%)
set h=%h:0=%
:: 计算生肖及干支年
set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
set tg=庚辛壬癸甲乙丙丁戊己
set dz=申酉戌亥子丑寅卯辰巳午未
set /a sxnum=%sy% %% 12
set /a tgnum=%sy:~-1%
title 农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1! 农历:%h%
:: 计算每个月的天数
set days=31
for %%i in (4 6 9 11) do if %m% equ %%i set days=30
:: 计算2月份的偏差
set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
if %m% equ 2 set /a days=28+%leap%
if %m% leq 2 (set /a y-=1& set /a m+=12)
:: 计算指定日期的星期数
set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7
echo. %sy%年%sm%月  日期:%sy%-%sm%-%sd%,星期!str:~%w%,1!
echo.
:: 生成月历
set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
echo.  日  一  二  三  四  五  六
echo. ━━━━━━━━━━━━━━━━━━━
set /p= <nul
for /l %%i in (0,1,37) do (
  set "temp= "
  if %%i GTR %wb% if %%i LSS %we% (
    set temp= !day!
    set temp=!temp:~-2!
    if !d! EQU !day! set temp=★
    set /a day+=1
  )
  set /p=  !temp!<nul
  set /a "wm=(%%i+1)%%7"
  if !wm! equ 0 echo.&echo.&set /p= <nul
)
echo.
echo ━━━━━━━━━━━━━━━━━━━
echo. 输入日期可查询当日星期并显示当月月历
echo.
set sdate=
set /p sdate= 格式如:2007-02-03,[回车]退出:
if defined sdate goto Main

以下是各计算部分算法:

计算星期:
基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数+1,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,
例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

生肖及干支年计算方法是:

出生公元年数÷12,然后根据除得的商的余数,对照生肖排列就马上可以知道。
生肖排列是:猴(0)、鸡(1)、狗(2)、猪(3)、鼠(4)、牛(5)、虎(6)、兔(7)、龙(8)、蛇(9)、马(10)、羊(11)。

天干地支算法:
首先要能记住十大天干和十二地支,
十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;
十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥;
天干地支纪年法首先是天干在前,地支在后,比如今年2005就为-乙酉年,先来算算天干,有个公式:
4、 5、 6、 7、 8、 9、 0、 1、 2、 3 对应的十天干就是
甲、乙、丙、丁、戊、己、庚、辛、壬、癸,
数字为年代的最后的一位数字,比如今年是2005,最后一位是5,对应的天干就是乙;
地支的算法:用年代数除以12,后面的余数就代表某个地支,余数分别为:
4、 5、 6、 7、 8、 9、 10、 11、 0、 1、 2、 3,
代表地支为:子、丑、寅、卯、辰、巳、午、 未、 申、酉、戌、亥,
比如2005年为例:年代末尾数为5,对应的天干为乙,2005除以12,余数为1,对应的地支为酉,所以2005年为乙酉年。

农历日期部分的算法是:
阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十 九日(大月为三十日)。然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查1984年6月8日是阴历几日?翻开万年历6月10日是阴历十一,则逆推6月8日是阴历初九。其二可以利用公式推算阴历日期:
设:公元年数-1977(或1901)=4Q+R
则:阴历日期=14Q+10.6(R+1)+年内日期序数-29.5n
(注:式中Q、R、n均为自然数,R<4)
例:1994年5月7日的阴历日期为:
1994-1977=17=4×4+1
故:Q=4,R=1 则:5月7日的阴历日期为:
14×4+10.6(1+1)+(31+28+31+30+7)-29.5n
=204.2- 29.5n
然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日。

到此这篇关于批处理万年历实现代码(包括农历日期)的文章就介绍到这了,更多相关批处理万年历内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 批处理万年历实现代码(包括农历日期)

    核心源码 :: 月历查询工具 最初发表于CN-DOS :: 原创:foxjl 更新:namejm, qzwqzw,foxjl :: 计算农历日期部分思路及算法来自"趣味东" :: 输入的日期格式为:年-月-日(-可以替换为:./,可以混用) :: 在日历里面,★=当天 :: 支持多种格式的日期输入: :: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上: :: ② 若输入两个数,则认为是查询年和月,★标在1日上: :: ③ 输全的话,★标在指定日期上 :

  • Javascript获取当前日期的农历日期代码

    JavaScript代码 /*设置农历日期*/ var CalendarData=new Array(100); var madd=new Array(12); var numString="一二三四五六七八九十"; var monString="正二三四五六七八九十冬腊"; var cYear,cMonth,cDay,TheDate; // 农历每月只能是29或30天,一年用12(或13)个二进制位表示,从高到低,对应位为1表示30天,否则29天 Calendar

  • JS简单获取当前日期和农历日期的方法

    本文实例讲述了JS简单获取当前日期和农历日期的方法.分享给大家供大家参考,具体如下: navCal.js文件如下: today=new Date(); function initArray(){ this.length=initArray.arguments.length for(var i=0;i<this.length;i++) this[i+1]=initArray.arguments[i] } var d=new initArray( "星期日", "星期一&q

  • PHP 实现公历日期与农历日期的互转换

    PHP 实现公历日期与农历日期的互转换 前言: 今天根据客户的需求对时间进行了转换,就是客户要求增加农历日期的显示,在网上抄袭了一段,稍微修改了一下运行成功了,不难的,改动的很少的. 示例代码: <?php /* * * 陈海波 新二级页面 农历转换成公历 * * */ // lunar.php 新建这个php文件,所有的代码无需改,需要改的是下面teacher.php 的几行 class Lunar { private $_SMDay = array(1 => 31, 28, 31, 30,

  • Python利用zhdate模块实现农历日期处理

    目录 简介 安装 主要功能 源码 简介 zhdate模块统计从1900年到2100年的农历月份数据代码,支持农历和公历之间的转化,并且支持日期差额运算. 安装 pip install zhdate 主要功能 1.获取公历对应的农历日期 2.获取中文描述农历日期 3.计算公历距离农历差额 获取公历对应的农历日期:格式ZhDate.from_datetime(datetime(year, month, day)) print(ZhDate.from_datetime(datetime(2022, 3

  • jQuery获取某天的农历日期并判断是否除夕或新年的方法

    本文实例讲述了jQuery获取某天的农历日期并判断是否除夕或新年的方法.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"

  • 批处理与python代码混合编程的方法

    批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值,比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写,bathome出品的命令工具包管理器bcn 使用了bat+jscript的混编实现的. cn-dos和bathome论坛里先后有帖子介绍和示范了批处理和各种语言脚本的混合编程,有兴趣可以搜索看看. python不挑剔文件后缀,只要程序中包含正确的python代码都可以用python 解释器解释执行. 批处理与python的混合编程方法很简单,

  • iOS 获取公历、农历日期的年月日的实例代码

    介绍三种方法获取 Date (NSDate) 的年月日. 用 date 表示当前日期.测试日期为公历 2017 年 2 月 5 日,农历丁酉年,鸡年,正月初九. let date: Date = Date() NSDate *date = [NSDate date]; 获取公历年月日 用 Calendar (NSCalendar) 获取公历年月日 let calendar: Calendar = Calendar(identifier: .gregorian) print("Year:"

  • PHP 万年历实现代码

    使用PHP实现万年历功能的要点: •得到当前要处理的月份总共有多少天$days •得到当前要处理的月份的一号是星期几$dayofweek $days的作用:知道要处理的月份共有多少天,就可以通过循环输出天数了 $dayofweek的作用:只有知道每个月的1号是星期几,才能知道在输出天数之前需要输出多少空格(空白) 最终效果图如下: "万年历类"的代码如下: 复制代码 代码如下: <?php /** * PHP万年历 * @author Fly 2012/10/16 */ clas

  • 修改ini文件的批处理与vbs代码

    批处理代码: @echo off >tmp.ini for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" 文件位置') do ( if "%%j"=="" (echo.>>tmp.ini) else ( echo %%j|find "被替换内容">nul&&( call set tp=%%j&call ech

随机推荐