System.DateUtils 4. IsValidDateTime... 有效时间判断
编译版本:Delphi XE7
function IsValidDate(const AYear, AMonth, ADay: Word): Boolean;
function IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;
function IsValidDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): Boolean; inline;
function IsValidDateDay(const AYear, ADayOfYear: Word): Boolean;
function IsValidDateWeek(const AYear, AWeekOfYear, ADayOfWeek: Word): Boolean; {ISO 8601}
function IsValidDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): Boolean; {ISO 8601x}
implementation
*注 Word类型取值范围:0--65535,故无需判断负数
// 判断是否为有效日期
function IsValidDate(const AYear, AMonth, ADay: Word): Boolean;
begin
Result := (AYear >= 1) and (AYear <= 9999) and
(AMonth >= 1) and (AMonth <= 12) and
(ADay >= 1) and (ADay <= DaysInAMonth(AYear, AMonth));
end;
// 获取当前月份日期数,因为存在闰年故需传入年份,引用单元 System.DateUtils
function DaysInAMonth(const AYear, AMonth: Word): Word;
begin
Result := MonthDays[(AMonth = 2) and IsLeapYear(AYear), AMonth];
end;
// 月份日期数列表,引用单元 System.SysUtils
const
MonthDays: array [Boolean] of TDayTable =
((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
// 判断是否为有效时间
function IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;
begin
Result := ((AHour < HoursPerDay) and (AMinute < MinsPerHour) and (ASecond < SecsPerMin) and (AMilliSecond < MSecsPerSec)) or // 每个时间类型都在取值范围内
((AHour = 24) and (AMinute = 0) and (ASecond = 0) and (AMilliSecond = 0)); // midnight early next day // 日期切换时间点
end;
// 时间单位,引用单元 System.SysUtils
HoursPerDay = 24; // 每天的小时数
MinsPerHour = 60; // 每天的分钟数
SecsPerMin = 60; // 每分的秒数
MSecsPerSec = 1000; // 每秒的毫秒数
// 判断是否为有效日期、时间
function IsValidDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;
begin
Result := IsValidDate(AYear, AMonth, ADay) and
IsValidTime(AHour, AMinute, ASecond, AMilliSecond);
end;
// 判断指定年份的日期数是否有效
function IsValidDateDay(const AYear, ADayOfYear: Word): Boolean;
begin
Result := (AYear >= 1) and (AYear <= 9999) and
(ADayOfYear >= 1) and (ADayOfYear <= DaysInAYear(AYear));
end;
// 获取该年的日期数
function DaysInAYear(const AYear: Word): Word;
begin
Result := DaysPerYear[IsLeapYear(AYear)];
end;
// 年份日期数列表,引用单元 System.DateUtils
DaysPerYear: array [Boolean] of Word = (365, 366);
// 判断指定年份的周数、周几在周范围是否有效
function IsValidDateWeek(const AYear, AWeekOfYear, ADayOfWeek: Word): Boolean;
begin
Result := (AYear >= 1) and (AYear <= 9999) and
(AWeekOfYear >= 1) and (AWeekOfYear <= WeeksInAYear(AYear)) and
(ADayOfWeek >= DayMonday) and (ADayOfWeek <= DaySunday);
end;
// 获取一年有几周
function WeeksInAYear(const AYear: Word): Word;
var
LDayOfWeek: Word;
begin
Result := 52;
LDayOfWeek := DayOfTheWeek(EncodeDate(AYear, 1, 1));
if (LDayOfWeek = DayThursday) or
((LDayOfWeek = DayWednesday) and IsLeapYear(AYear)) then
Inc(Result);
end;
// 将指定的年、月、日转为日期、时间格式
function EncodeDate(Year, Month, Day: Word): TDateTime;
begin
if not TryEncodeDate(Year, Month, Day, Result) then
ConvertError(@SDateEncodeError);
end;
// 尝试将指定的年、月、日转为日期、时间格式
function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;
var
I: Integer;
DayTable: PDayTable;
begin
Result := False;
DayTable := @MonthDays[IsLeapYear(Year)];
if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and
(Day >= 1) and (Day <= DayTable^[Month]) then
begin
for I := 1 to Month - 1 do Inc(Day, DayTable^[I]);
I := Year - 1;
Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta;
Result := True;
end;
end;
// 获取指定日期是周几
function DayOfTheWeek(const AValue: TDateTime): Word;
begin
Result := (DateTimeToTimeStamp(AValue).Date - 1) mod 7 + 1;
end;
// 将日期、时间格式转换为时间戳格式
function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
{$IF defined(PUREPASCAL) or defined(MACOS)}
var
LTemp, LTemp2: Int64;
begin
LTemp := Round(DateTime * FMSecsPerDay);
LTemp2 := (LTemp div IMSecsPerDay);
Result.Date := DateDelta + LTemp2;
Result.Time := Abs(LTemp) mod IMSecsPerDay;
end;
// 判断是否为有效的年、月、月内第几周、周几
function IsValidDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): Boolean;
begin
Result := (AYear >= 1) and (AYear <= 9999) and
(AMonth >= 1) and (AMonth <= 12) and
(AWeekOfMonth >= 1) and (AWeekOfMonth <= 5) and // 特殊情况下,最大周应该为6周;除非计算方式为满周,即无论1号为周几,均满7天算一周
(ADayOfWeek >= DayMonday) and (ADayOfWeek <= DaySunday);
end;
// 周几,引用单元 System.DateUtils
DayMonday = 1;
DayTuesday = 2;
DayWednesday = 3;
DayThursday = 4;
DayFriday = 5;
DaySaturday = 6;
DaySunday = 7;
System.DateUtils 4. IsValidDateTime... 有效时间判断的更多相关文章
- System.DateUtils 2. IsInLeapYear 判断是否是闰年
编译版本:Delphi XE7 function IsInLeapYear(const AValue: TDateTime): Boolean; implementation // 判断是否是闰年 f ...
- System.DateUtils 3. IsPM、IsAM 判断是否为上、下午
编译版本:Delphi XE7 function IsPM(const AValue: TDateTime): Boolean; inline;function IsAM(const AValue: ...
- C# System.Windows.Forms.WebBrowser中判断浏览器内核和版本
参考 [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器 利用js来判断 namespac ...
- System.DateUtils 1. DateOf、TimeOf 简单修饰功能
编译版本:Delphi XE7 { Simple trimming functions } // 简单修饰功能 function DateOf(const AValue: TDateTime): TD ...
- DateUtils时间单元说明
CompareDate 函数 比较两个日期时间值日期部分的大小 CompareDateTime 函数 比较两个日期时间值的大小 CompareTime 函数 比较两个日期时间值时间部分的大小 Date ...
- commons-lang3中DateUtils类方法介绍
添加commons-lang3的Maven依赖 <dependency> <groupId>org.apache.commons</groupId> <art ...
- 【Java】commons-lang3中DateUtils类方法介绍
添加commons-lang3的Maven依赖 <dependency> <groupId>org.apache.commons</groupId> <art ...
- c#判断闰年
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 疯狂java笔记(五) - 系统交互、System、Runtime、Date类
一.程序与用户交互(Java的入口方法-main方法): 运行Java程序时,都必须提供一个main方法入口:public static void main(String[] args){} publ ...
随机推荐
- LLBLGen Pro v4.2_Patch+Keygen
将dll文件覆盖安装目录下的文件,之后用算号器算出license文件,将license文件放在安装目录下即可. 算号器是在http://www.dxper.net/thread-408-1-1.htm ...
- c/c++程序员必须要掌握开源项目
作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...
- Vsftp精解之安装配置及原理(一)
简介 Vsftp(Very Secure FTP)是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,是一款小巧而又易用FTP服务器程序,Vsftpd 在安全性.高性能及稳定性三个方面有很好 ...
- Android高效加载大图、多图解决方案,有效避免程序OOM
高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...
- a链接的四种状态
四种状态:hover.link.active.visible a:link{color:#fff;} a链接初始化 a:hover{color:yellow;} 把鼠标放上去的状况 a:active{ ...
- cookie 保存上次访问url方法
if (Session[Enums.UserInfoSeesion] == null) { HttpCookie cookie = Request.Cookies[Enums.UserLastAcce ...
- PYTHON 链接 Oracle
一. cx_Oracle Python 连接Oracle 数据库,需要使用cx_Oracle 包. 该包的下载地址:http://cx-Oracle.sourceforge.net/ 下载的时候,注 ...
- sync_with_stdio
/* The synchronization referred to is @e only that between the standard * C facilities (e.g., stdout ...
- CSS Animation
div { /* Chrome, Safari, Opera 等使用webkit引擎的浏览器*/ -webkit-animation-name: myfirst; /*规定 @keyframes 动画 ...
- No.2 CAS之SPNEGO+LDAP认证配置
1.概述 本文先配置了SPNEGO认证,就是如果用户操作系统如果登陆了公司的Windows域,用户浏览器访问应用服务即可免登录. 然后如果不在域里的员工,用LDAP认证方式,输账号密码登陆. 参考文档 ...