Ask Ben: Cleaning Two Digit Years Using Javascript And Regular Expressions

Posted January 26, 2007 at 8:34 AM

Tags: Javascript / DHTML, Ask Ben

Hey Ben,

Trying to replace a date "/" character with both the character and either a string of 19 or 20, for 2 year purposes.

For example, people are accustomed to plugging in the dates into their form with mm/dd/yy format. So when they plug in 12/23/97, I'd like to replace the second instance of / with /19 preceeding the 97.

If the last two year figures begin with 0 or 1, I'd replace the "/" with "/20" preceeding the rest of the figure. i.e. 09/17/02 would become 09/17/2002.

Is there a way to replace this with regular expressions? How would that be done?

The beauty of using Regular Expressions in Javascript is that each match made by the regular expression can be passed off to a Javascript function literal. You won't see this happening in any kind of compiled language such as Java or ColdFusion, which is part of why Javascript, as an interpreted language, is so freakin' sweet-ass!

For this solution, all we have to do is write a function that takes a given date string, checks for a two digit year, check the leading character and then returns the two digits with the proper two digits pre-pended.

 Launch code in new window » Download code as text file »

  • // This takes a date string that MIGHT have a two digit year
  • // as the last two digits. If it does, this function replaces
  • // the two digit year with what it *assumes* is the proper
  • // four digit year.
  • function CleanDate( strDate ){
  •  
  • // Return the cleaned date.
  • return(
  • strDate.replace(
  •  
  • // This regular expression will search for a slash
  • // followed by EXACTLY two digits at the end of
  • // this date string. The two digits are being
  • // grouped together for future referencing.
  • new RegExp( "/(\\d{2})$", "" ),
  •  
  • // We are going to pass the match made by the
  • // regular expression off to this function literal.
  • // Our arguments are as follows:
  • // $0 : The entire match found.
  • // $1 : The first group within the match.
  • function( $0, $1 ){
  •  
  • // Check to see if our first group begins with
  • // a zero or a one. If so, replace with 20 else
  • // replace with 19.
  • if ($1.match( new RegExp( "^[01]{1}", "" ) )){
  •  
  • // Replace with 20.
  • return( "/20" + $1 );
  •  
  • } else {
  •  
  • // Replace with 19.
  • return( "/19" + $1 );
  •  
  • }
  •  
  • }
  • )
  • );
  •  
  • }

Hope that helps!

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page




Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

Jan 26, 2007 at 9:46 AM // reply »
11 Comments

Having users enter a two digit year is part of the Y2K issue. A common solution for 2 year digit data was to use a pivot formula, for the below example, I set 70 as the pivot year.

Easy enough to set the pivot base, depending on the type of question being asked, such as your birth date, and then depending on the age of your user base, lower the pivot. For me, entering in 61 would result in 2061, so I'd probably lower the pivot date a bit.

<script language="javascript">
function getPivot(year) {
if (year < 70) return (2000 + year);
if (year < 1900) return (1900 + year);
return year;
}

function getDate(){
var myDate = new Date(document.getElementById('testDate').value);
var pivotDate = new Date(getPivot(myDate.getYear()),myDate.getMonth(),myDate.getDate());
alert(pivotDate);
}

</script>
<input id="testDate" value="" onchange="getDate();" />


Jan 26, 2007 at 6:11 PM // reply »
6,516 Comments

Chris,

That's a cool little snippet of code there. Thanks!


Jan 28, 2007 at 8:41 PM // reply »
95 Comments

Ben,

your example is pretty nifty. I didn't realize that you can do the equivalent of the matchEvaulator in .NET but with Java/CF Script! Nice! On a more relevant note do deal with the issue I usually just provide a calendar widget. The one at http://www.dynarch.com/projects/calendar/ is free, full of features and customizable. I use it all the time. A quick question for you, why did you have to escape the "\" in front of the special sequence "\d" as in "\\d"?

On a side note, you never got back to me about the code snippets idea.


Post Comment  |  Ask Ben

Recent Blog Comments
Nov 20, 2009 at 11:32 PM
Five Months Without Hungarian Notation And I'm Loving It
I've used headless camel case for years for not only ColdFusion variables, but also SQL tables and fields... pretty much everything involving code. I also subscribe to the "don't abbreviate and clea ... read »
Nov 20, 2009 at 11:00 PM
Five Months Without Hungarian Notation And I'm Loving It
@Marcel, Yeah, I always err on the side of longer but more readable variable names. As for the camel casing of CF methods and the headless camel casing of custom items, I get around this by always ... read »
Nov 20, 2009 at 10:56 PM
Five Months Without Hungarian Notation And I'm Loving It
I use the following and love it: my.namespace.MyComponents.functionMethodsOrUDF() CONSTANT_VALUES_OR_PROPERTIES One thing I always try is to CamelCaseBuiltInColdFusionFunctions() so others can tell ... read »
Nov 20, 2009 at 5:38 PM
Learning ColdFusion 8: CFImage Part I - Reading And Writing Images
Hi Ben, Great article. I've been looking around to see if ColdFusion image engine can programatically create the following "wrap around" effect: http://www.creativepro.com/article/photoshop-s-she ... read »
Nov 20, 2009 at 5:35 PM
Maintaining ColdFusion Sessions Across SMS Text Message Requests Without Cookies
@Dave: I talked to Gert he suggested: <cfhttp method="get" url="http://{some cf website}" result="stuff" addtoken="yes" /> Note the addition of cfhttp attribute addtoken. That should persist y ... read »
Nov 20, 2009 at 5:23 PM
Maintaining ColdFusion Sessions Across SMS Text Message Requests Without Cookies
@Todd, Ahh, gotcha, yeah that makes sense. ... read »
Nov 20, 2009 at 5:17 PM
Maintaining ColdFusion Sessions Across SMS Text Message Requests Without Cookies
Ben, sorry if I didn't make this clear. You can make it work like that if you want, just put <cfset session.foo = 1> (and <cfset application.foo = 1>) in your OnRequestStart() and it reve ... read »