Click here to Skip to main content
6,596,602 members and growing! (20,597 online)
Email Password   helpLost your password?
Web Development » Client side scripting » General     Intermediate

JavaScript Date Format

By Tor2k

A fast VB-like date format function in JavaScript (requires JScript 5.5+).
JavascriptWin2K, WinXP, Visual Studio, Dev
Posted:16 Jul 2005
Updated:7 Aug 2005
Views:109,262
Bookmarked:42 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
15 votes for this article.
Popularity: 5.51 Rating: 4.68 out of 5

1

2

3
4 votes, 26.7%
4
11 votes, 73.3%
5

Introduction

I needed a JavaScript date format function such as the Visual Basic Format function, in which you can pass a format string; my first approach was to issue a series of consecutive and "destructive" replace calls, but upon discovering that the 5.5 (or higher) version of JScript supported the use of a function as the replaceText argument of the replace method, I got creative.

Here's an example call of what I wanted:

SomeDiv.innerText = (new Date()).format('dddd, mmmm dd, yyyy.');

This would display:

Saturday, July 16, 2005

So in my first approach, I globally and case-insensitively replaced dddd with the corresponding string, which "destroyed" every occurrence, so that later in the code I could replace dd with the date number.

This worked just fine, but I knew that by inspecting the format specifier for a match, I could skip the search of every format specifier; say I only want the month and the date; well, by switching upon the format specifier (or rather "datepart" specifier), the year replacement will never be issued. Get it?

The fun part relies in the use of a function in the replaceText argument of the replace method; this way the $1 property as a function argument always represents the last match.

Other considerations include the format or "datepart" specifiers: none other than yyyy will be parsed as the year; months and days have the usual three flavors of fullname (mmmm), three-letter (mmm) or numeric (mm); hours (hh) can be rectified to the 12-hour format with the a/p specifier, and minutes (nn) and seconds (ss) may also be specified.

Implementation

WOFA, (Without Further Adou):

// a global month names array

var gsMonthNames = new Array(
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
);
// a global day names array

var gsDayNames = new Array(
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
);
// the date format prototype

Date.prototype.format = function(f)
{
    if (!this.valueOf())
        return ' ';

    var d = this;

    return f.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/gi,
        function($1)
        {
            switch ($1.toLowerCase())
            {
            case 'yyyy': return d.getFullYear();
            case 'mmmm': return gsMonthNames[d.getMonth()];
            case 'mmm':  return gsMonthNames[d.getMonth()].substr(0, 3);
            case 'mm':   return (d.getMonth() + 1).zf(2);
            case 'dddd': return gsDayNames[d.getDay()];
            case 'ddd':  return gsDayNames[d.getDay()].substr(0, 3);
            case 'dd':   return d.getDate().zf(2);
            case 'hh':   return ((h = d.getHours() % 12) ? h : 12).zf(2);
            case 'nn':   return d.getMinutes().zf(2);
            case 'ss':   return d.getSeconds().zf(2);
            case 'a/p':  return d.getHours() < 12 ? 'a' : 'p';
            }
        }
    );
}

Notes

  • A date with a value of 0 returns a non-breaking space.
  • Notice how the d variable is available to the replacement function (but the this object is not).
  • The zf number prototype (not shown) prefixes a number with zeroes the specified number of times, up to the number's character length, i.e. 2 turns into 02, but 16 remains 16. Behave and I may supply the prototype.
  • The regular expression looks for any of the bracketed pattern characters in a two+ sequence, or for the very specific a/p match.
  • Defining names globally helps and serves other purposes, i.e. listing days in a calendar.

Enjoy.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Tor2k


Member
Born April 27, 1968 in Caracas, Venezuela, Hector J. Rivas has 24+ years of experience managing hardware and software development under many different operating systems, platforms and languages. He has developed microcontroller interfaces and PC games; authored computer based training lessons and delivered fully functional financial and administrative data-intensive applications, as well as image processing and other calculation-intensive applications. Mr. Rivas has also managed Y2K remediation, large scale platform migration and Web site projects, from R&D to actual deployment.
Occupation: Web Developer
Location: United States United States

Other popular Client side scripting articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 19 of 19 (Total in Forum: 19) (Refresh)FirstPrevNext
GeneralPutting it all together so far Pinmembermurray5617:15 2 Mar '07  
GeneralRe: Putting it all together so far Pinmembermurray5618:09 2 Mar '07  
GeneralRe: Putting it all together so far PinmemberTor2k21:09 4 Mar '07  
GeneralRe: Putting it all together so far Pinmembermurray5622:49 5 Mar '07  
Generalhey PinmemberFrenaaa9:09 3 Dec '06  
GeneralRe: hey PinmemberTor2k8:22 8 Dec '06  
GeneralEasy but useful PinmemberNinghuan23:01 25 Apr '06  
GeneralC#-like formats PinmemberKjetil Klaussen0:15 9 Mar '06  
GeneralZF PinmemberTunez2:09 1 Aug '05  
GeneralRe: ZF PinmemberTor2k15:00 2 Aug '05  
GeneralA couple of bugs PinmemberRichard Deeming8:08 26 Jul '05  
GeneralRe: A couple of bugs PinmemberTor2k11:42 26 Jul '05  
GeneralRe: A small addition PinmemberDougww4:13 5 Aug '05  
GeneralRe: A small addition PinmemberTor2k8:16 6 Aug '05  
GeneralRe: A small addition PinmemberRichard Deeming3:21 10 Aug '05  
GeneralRe: A small addition PinmemberTor2k7:18 10 Aug '05  
GeneralRe: A small addition Pinmembershadowcreeper11:05 20 Apr '09  
GeneralRe: A small addition PinmemberTor2k6:47 21 Apr '09  
GeneralRe: A small addition: string 'choose' io switch PinmemberTor2k10:30 8 Aug '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 7 Aug 2005
Editor: Smitha Vijayan
Copyright 2005 by Tor2k
Everything else Copyright © CodeProject, 1999-2009
Web20 | Advertise on the Code Project