DELPHI 阳历转农历代码

2024-06-14 15:18
文章标签 代码 delphi 农历 阳历

本文主要是介绍DELPHI 阳历转农历代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

unit DateCn;  interface  uses Windows, SysUtils, Controls;  const  //农历月份数据,每年4字节,从1901年开始,共150年  //数据来源:UCDOS 6.0 UCT.COM  //分析整理:Copyright (c) 1996-1998, Randolph  //数据解析:  //如果第一字节的bit7为1,则该年1月1日位于农历12月,否则位于11月  //第一字节去除bit7为该年1月1日的农历日期  //        第二字节                第三字节  //bit:    7  6  5  4  3  2  1  0  7  6  5  4  3  2  1  0  //农历月份:16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  //农历月份指的是从该年1月1日的农历月份算起的顺序号  //农历月份对应的bit为1则该月为30日,否则为29日  //第四字节为闰月月份  CnData: array[0..599] of Byte = (  $0b,$52,$ba,$00,$16,$a9,$5d,$00,$83,$a9,$37,$05,$0e,$74,$9b,$00,  $1a,$b6,$55,$00,$87,$b5,$55,$04,$11,$55,$aa,$00,$1c,$a6,$b5,$00,  $8a,$a5,$75,$02,$14,$52,$ba,$00,$81,$52,$6e,$06,$0d,$e9,$37,$00,  $18,$74,$97,$00,$86,$ea,$96,$05,$10,$6d,$55,$00,$1a,$35,$aa,$00,  $88,$4b,$6a,$02,$13,$a5,$6d,$00,$1e,$d2,$6e,$07,$0b,$d2,$5e,$00,  $17,$e9,$2e,$00,$84,$d9,$2d,$05,$0f,$da,$95,$00,$19,$5b,$52,$00,  $87,$56,$d4,$04,$11,$4a,$da,$00,$1c,$a5,$5d,$00,$89,$a4,$bd,$02,  $15,$d2,$5d,$00,$82,$b2,$5b,$06,$0d,$b5,$2b,$00,$18,$ba,$95,$00,  $86,$b6,$a5,$05,$10,$56,$b4,$00,$1a,$4a,$da,$00,$87,$49,$ba,$03,  $13,$a4,$bb,$00,$1e,$b2,$5b,$07,$0b,$72,$57,$00,$16,$75,$2b,$00,  $84,$6d,$2a,$06,$0f,$ad,$55,$00,$19,$55,$aa,$00,$86,$55,$6c,$04,  $12,$c9,$76,$00,$1c,$64,$b7,$00,$8a,$e4,$ae,$02,$15,$ea,$56,$00,  $83,$da,$55,$07,$0d,$5b,$2a,$00,$18,$ad,$55,$00,$85,$aa,$d5,$05,  $10,$53,$6a,$00,$1b,$a9,$6d,$00,$88,$a9,$5d,$03,$13,$d4,$ae,$00,  $81,$d4,$ab,$08,$0c,$ba,$55,$00,$16,$5a,$aa,$00,$83,$56,$aa,$06,  $0f,$aa,$d5,$00,$19,$52,$da,$00,$86,$52,$ba,$04,$11,$a9,$5d,$00,  $1d,$d4,$9b,$00,$8a,$74,$9b,$03,$15,$b6,$55,$00,$82,$ad,$55,$07,  $0d,$55,$aa,$00,$18,$a5,$b5,$00,$85,$a5,$75,$05,$0f,$52,$b6,$00,  $1b,$69,$37,$00,$89,$e9,$37,$04,$13,$74,$97,$00,$81,$ea,$96,$08,  $0c,$6d,$52,$00,$16,$2d,$aa,$00,$83,$4b,$6a,$06,$0e,$a5,$6d,$00,  $1a,$d2,$6e,$00,$87,$d2,$5e,$04,$12,$e9,$2e,$00,$1d,$ec,$96,$0a,  $0b,$da,$95,$00,$15,$5b,$52,$00,$82,$56,$d2,$06,$0c,$2a,$da,$00,  $18,$a4,$dd,$00,$85,$a4,$bd,$05,$10,$d2,$5d,$00,$1b,$d9,$2d,$00,  $89,$b5,$2b,$03,$14,$ba,$95,$00,$81,$b5,$95,$08,$0b,$56,$b2,$00,  $16,$2a,$da,$00,$83,$49,$b6,$05,$0e,$64,$bb,$00,$19,$b2,$5b,$00,  $87,$6a,$57,$04,$12,$75,$2b,$00,$1d,$b6,$95,$00,$8a,$ad,$55,$02,  $15,$55,$aa,$00,$82,$55,$6c,$07,$0d,$c9,$76,$00,$17,$64,$b7,$00,  $86,$e4,$ae,$05,$11,$ea,$56,$00,$1b,$6d,$2a,$00,$88,$5a,$aa,$04,  $14,$ad,$55,$00,$81,$aa,$d5,$09,$0b,$52,$ea,$00,$16,$a9,$6d,$00,  $84,$a9,$5d,$06,$0f,$d4,$ae,$00,$1a,$ea,$4d,$00,$87,$ba,$55,$04,  $12,$5a,$aa,$00,$1d,$ab,$55,$00,$8a,$a6,$d5,$02,$14,$52,$da,$00,  $82,$52,$ba,$06,$0d,$a9,$3b,$00,$18,$b4,$9b,$00,$85,$74,$9b,$05,  $11,$b5,$4d,$00,$1c,$d6,$a9,$00,$88,$35,$aa,$03,$13,$a5,$b5,$00,  $81,$a5,$75,$0b,$0b,$52,$b6,$00,$16,$69,$37,$00,$84,$e9,$2f,$06,  $10,$f4,$97,$00,$1a,$75,$4b,$00,$87,$6d,$52,$05,$11,$2d,$69,$00,  $1d,$95,$b5,$00,$8a,$a5,$6d,$02,$15,$d2,$6e,$00,$82,$d2,$5e,$07,  $0e,$e9,$2e,$00,$19,$ea,$96,$00,$86,$da,$95,$05,$10,$5b,$4a,$00,  $1c,$ab,$69,$00,$88,$2a,$d8,$03);  function CnMonthOfDate(Date: TDate): String;//指定日期的农历月  function CnDayOfDate(Date: TDate): String;//指定日期的农历日  function CnDateOfDateStr(Date: TDate): String;//指定日期的农历日期  implementation  //日期是该年的第几天,1月1日为第一天  
function DaysNumberOfDate(Date: TDate): Integer;  
var  DaysNumber: Integer;  I: Integer;  yyyy, mm, dd: Word;  
begin  DecodeDate(Date, yyyy, mm, dd);  DaysNumber := 0;  for I := 1 to mm - 1 do  Inc(DaysNumber, MonthDays[IsLeapYear(yyyy), I]);  Inc(DaysNumber, dd);  Result := DaysNumber;  
end;  //日期的农历日期,返回农历格式:月份*100 + 日,负数为闰月  
//超出范围则返回0  
function CnDateOfDate(Date: TDate): Integer;  
var  CnMonth, CnMonthDays: array[0..15] of Integer;  CnBeginDay, LeapMonth: Integer;  yyyy, mm, dd: Word;  Bytes: array[0..3] of Byte;  I: Integer;  CnMonthData: Word;  DaysCount, CnDaysCount, ResultMonth, ResultDay: Integer;  
begin  DecodeDate(Date, yyyy, mm, dd);  if (yyyy < 1901) or (yyyy > 2050) then  begin  Result := 0;  Exit;  end;  Bytes[0] := CnData[(yyyy - 1901) * 4];  Bytes[1] := CnData[(yyyy - 1901) * 4 + 1];  Bytes[2] := CnData[(yyyy - 1901) * 4 + 2];  Bytes[3] := CnData[(yyyy - 1901) * 4 + 3];  if (Bytes[0] and $80) <> 0 then CnMonth[0] := 12  else CnMonth[0] := 11;  CnBeginDay := (Bytes[0] and $7f);  CnMonthData := Bytes[1];  CnMonthData := CnMonthData shl 8;  CnMonthData := CnMonthData or Bytes[2];  LeapMonth := Bytes[3];  for I := 15 downto 0 do  begin  CnMonthDays[15 - I] := 29;  if ((1 shl I) and CnMonthData) <> 0 then  Inc(CnMonthDays[15 - I]);  if CnMonth[15 - I] = LeapMonth then  CnMonth[15 - I + 1] := - LeapMonth  else  begin  if CnMonth[15 - I] < 0 then //上月为闰月 
CnMonth[15 - I + 1] := - CnMonth[15 - I] + 1 
else CnMonth[15 - I + 1] := CnMonth[15 - I] + 1; 
if CnMonth[15 - I + 1] > 12 then CnMonth[15 - I + 1] := 1;  end;  end;  DaysCount := DaysNumberOfDate(Date) - 1;  if DaysCount <= (CnMonthDays[0] - CnBeginDay) then 
begin 
if (yyyy > 1901) and  (CnDateOfDate(EncodeDate(yyyy - 1, 12, 31)) < 0) then 
ResultMonth := - CnMonth[0] 
else ResultMonth := CnMonth[0]; 
ResultDay := CnBeginDay + DaysCount; 
end 
else 
begin 
CnDaysCount := CnMonthDays[0] - CnBeginDay; 
I := 1; 
while (CnDaysCount < DaysCount) and 
(CnDaysCount + CnMonthDays[I] < DaysCount) do 
begin 
Inc(CnDaysCount, CnMonthDays[I]); 
Inc(I); 
end; 
ResultMonth := CnMonth[I]; 
ResultDay := DaysCount - CnDaysCount; 
end; 
if ResultMonth > 0 then  Result := ResultMonth * 100 + ResultDay  else Result := ResultMonth * 100 - ResultDay  
end;  function CnMonthOfDate(Date: TDate): String;  
const  CnMonthStr: array[1..12] of String = (  '一', '二', '三', '四', '五', '六', '七', '八', '九', '十',  '冬', '蜡');  
var  Month: Integer;  
begin  Month := CnDateOfDate(Date) div 100;  if Month < 0 then Result := '闰' + CnMonthStr[-Month] 
else Result := CnMonthStr[Month] + '月'; 
end; function CnDayOfDate(Date: TDate): String; 
const 
CnDayStr: array[1..30] of String = ( 
'初一', '初二', '初三', '初四', '初五', 
'初六', '初七', '初八', '初九', '初十', 
'十一', '十二', '十三', '十四', '十五', 
'十六', '十七', '十八', '十九', '二十', 
'廿一', '廿二', '廿三', '廿四', '廿五', 
'廿六', '廿七', '廿八', '廿九', '三十'); 
var 
Day: Integer; 
begin 
Day := Abs(CnDateOfDate(Date)) mod 100; 
Result := CnDayStr[Day]; 
end; function CnDateOfDateStr(Date: TDate): String; 
begin 
Result := CnMonthOfDate(Date) + CnDayOfDate(Date); 
end; end. 

这篇关于DELPHI 阳历转农历代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060769

相关文章

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实