Jump to content

Validate Date (dd.mm.yyyy)


Recommended Posts

Hello,

I'm currently working on a method that checks if a given date is valid.

My solution looks like this:

Func _Valid($Check)
   $match = StringRegExp($Check,"^(\d{2})\.(\d{2})\.(\d{4})$",1)
   If IsArray($match) then 
      
      If Mod($match[1],2) = 0 And $match[0] > 30 Then Return False
      If Mod($match[1],2) = 1 And $match[0] > 31 Then Return False
         
      If Mod($match[2],4) = 0 And $match[0] > 29 then Return False
      If Mod($match[2],4) <> 0 And $match[0] > 28 then Return False
      
      Return True
   Else
      Return False
   EndIf
  
EndFunc

I haven't included leap years like 1600,2000,2400, which is fine for my purpose.

I wonder if my function works 100% right?

But what I'm really interested in is: What is the most compact function to do this job?

Or how do YOU validate dates?

 

Thanks

Link to comment
Share on other sites

I know that there's a function in the Date library that does this. But it only accepts yyyy.mm.dd right?

So I could convert my format to this format and use _DateIsValid().

But I thought that there is a better or more elegant or more interesting solution!?

Link to comment
Share on other sites

From the help file.

 

This function takes a date input in one of the following formats:
"yyyy/mm/dd[ hh:mm[:ss]]" or "yyyy/mm/dd[Thh:mm[:ss]]"
"yyyy-mm-dd[ hh:mm[:ss]]" or "yyyy-mm-dd[Thh:mm[:ss]]"
"yyyy.mm.dd[ hh:mm[:ss]]" or "yyyy.mm.dd[Thh:mm[:ss]]"

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

As a general rule of thumb, dates and timestamps in IT should only be stored in some computational format (Julian date, Unix epoch, ISO string, etc.) and only converted back and forth for human interface.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

and you are going to have problems next month

msgbox(0, '' , _Valid("28.04.2015"))
msgbox(0, '' , _Valid("29.04.2015"))
msgbox(0, '' , _Valid("30.04.2015"))


Func _Valid($Check)
   $match = StringRegExp($Check,"^(\d{2})\.(\d{2})\.(\d{4})$",1)



   If IsArray($match) then

      If Mod($match[1],2) = 0 And $match[0] > 30 Then Return False
      If Mod($match[1],2) = 1 And $match[0] > 31 Then Return False

      If Mod($match[2],4) = 0 And $match[0] > 29 then Return False
      If Mod($match[2],4) <> 0 And $match[0] > 28 then Return False

      Return True
   Else
      Return False
   EndIf

EndFunc

And this month, including today, are False as well.   Im pretty sure that says:  if it passes the mod 4 check, every month can only have 28 days.  Which is wrong in every possible way.

Edited by boththose

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to comment
Share on other sites

At new year's eve too

msgbox(0, '' , _Valid("31.12.2015"))


Func _Valid($Check)
   $match = StringRegExp($Check,"^(\d{2})\.(\d{2})\.(\d{4})$",1)
   If IsArray($match) then

      If Mod($match[1],2) = 0 And $match[0] > 30 Then Return False
      If Mod($match[1],2) = 1 And $match[0] > 31 Then Return False

      If Mod($match[2],4) = 0 And $match[0] > 29 then Return False
      If Mod($match[2],4) <> 0 And $match[0] > 28 then Return False

      Return True
   Else
      Return False
   EndIf
EndFunc
Link to comment
Share on other sites

Corollary to ... myself: first convert data into computer-friendly format as soon as possible, then process it. Only convert it back for display, print ou speech.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

i didnt see you were also excluding the third criteria of leap-ness.  post #9 would probably hold up then.

Edited by boththose

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to comment
Share on other sites

..while reinventing, where are the gaps here?

msgbox(0, '' , _Valid("28.02.1900"))
msgbox(0, '' , _Valid("29.02.1900"))
msgbox(0, '' , _Valid("28.02.2000"))
msgbox(0, '' , _Valid("29.02.2000"))

Func _Valid($Check)
   $match = StringRegExp($Check,"^(\d{2})\.(\d{2})\.(\d{4})$",1)
   If IsArray($match) then

      If Mod($match[1],2) = 0 And $match[0] > 30 Then Return False
      If Mod($match[1],2) = 1 And $match[0] > 31 Then Return False

      If Mod($match[2],4) = 0 And $match[0]  > 29 And $match[1] = 2 then Return False
      If Mod($match[2],4) = 0 And Mod($match[2],400) And $match[0] > 28 And $match[1] = 2 then Return False
      If Mod($match[2],4) <> 0 And Mod($match[2],400) And $match[0] > 28 And $match[1] = 2 then Return False

      Return True
   Else
      Return False
   EndIf

EndFunc
Edited by boththose

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to comment
Share on other sites

easy fix (and i dont think the last),  and it may be a big ugly slow wheel, but at least its new.  and i bet your next is better.

Dont be discouraged from learning how to manipulate the data yourself just because there is a prepackaged solution.  For example, it may be a lot less typing to use an _array function, but they are not the most compact ListView functions.  And I always enjoy seeing alternate solution threads, especially when they devolve into gamesmanship resulting in a ridiculous nested ternary one-liner.

Edited by boththose

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to comment
Share on other sites

Found this ridiculously long regex.

msgbox(0, '' , _Valid("31.03.2015"))
msgbox(0, '' , _Valid("32.03.2015"))
msgbox(0, '' , _Valid("29.02.2015"))
msgbox(0, '' , _Valid("29.02.2000"))
msgbox(0, '' , _Valid("31.12.2015"))

Func _Valid($val)
   Return StringRegExp($val,"(^(((0[1-9]|[12][0-8])[\.](0[1-9]|1[012]))|((29|30|31)[\.](0[13578]|1[02]))|((29|30)[\.](0[4,6,9]|11)))[\.](19|[2-9][0-9])\d\d$)|(^29[\.]02[\.](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)")
EndFunc

Seems to work.

I don't know whats going on exactly but hey.

Link to comment
Share on other sites

Do you have a link to where you found that regular expression?

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...