» Javascript equivalent for PHP's date

399 PHP equivalents

PHP to Javascript Project: php.js

php.jsThis article is part of the 'Porting PHP to Javascript' Project, which aims to decrease the gap between developing for PHP & Javascript.

A lot of people are familiar with PHP's functions, and though Javascript functions are often quite similar, some functions may be missing or addressed differently. The Javascript implementations should be as compliant with the PHP versions as possible, a good indication is that the PHP function manual could also apply to the Javascript version.

Porting crucial PHP functions to Javascript can be fun & useful. Currently some PHP functions have been added, but readers are encouraged to contribute and improve functions by adding comments. Eventually the goal is to save all the functions in one php.js file and make it publicly available for your coding pleasure.

If you choose to contribute, let me know how you want to be credited in the function's comments. You may also want to subscribe to RSS so you receive updates whenever new functions are posted.

This is a Javascript version of the PHP function: date.

I have moved out PHP.JS to it's own site. For info & reactions on comments please goto phpjs.org

PHP date

Description

date - Format a local time/date

string date( string format [, int timestamp] )

Returns a string formatted according to the given format string using the given integer timestamp or the current time if no timestamp is given.In other words, timestamp is optional and defaults to the value of time().

Parameters

  • format

    The format of the outputted date string. See the formatting options below.

    The following characters are recognized in the format parameter string

    format character Description Example returned values
    Day --- ---
    d Day of the month, 2 digits with leading zeros 01 to 31
    D A textual representation of a day, three letters Mon through Sun
    j Day of the month without leading zeros 1 to 31
    l (lowercase 'L') A full textual representation of the day of the week Sunday through Saturday
    N ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0) 1 (for Monday) through 7 (for Sunday)
    S English ordinal suffix for the day of the month, 2 characters st, nd, rd or th. Works well with j
    w Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday)
    z The day of the year (starting from 0) 0 through 365
    Week --- ---
    W ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year)
    Month --- ---
    F A full textual representation of a month, such as January or March January through December
    m Numeric representation of a month, with leading zeros 01 through 12
    M A short textual representation of a month, three letters Jan through Dec
    n Numeric representation of a month, without leading zeros 1 through 12
    t Number of days in the given month 28 through 31
    Year --- ---
    L Whether it's a leap year 1 if it is a leap year, 0 otherwise.
    o ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. (added in PHP 5.1.0) Examples: 1999 or 2003
    Y A full numeric representation of a year, 4 digits Examples: 1999 or 2003
    y A two digit representation of a year Examples: 99 or 03
    Time --- ---
    a Lowercase Ante meridiem and Post meridiem am or pm
    A Uppercase Ante meridiem and Post meridiem AM or PM
    B Swatch Internet time 000 through 999
    g 12-hour format of an hour without leading zeros 1 through 12
    G 24-hour format of an hour without leading zeros 0 through 23
    h 12-hour format of an hour with leading zeros 01 through 12
    H 24-hour format of an hour with leading zeros 00 through 23
    i Minutes with leading zeros 00 to 59
    s Seconds, with leading zeros 00 through 59
    u Milliseconds (added in PHP 5.2.2) Example: 54321
    Timezone --- ---
    e Timezone identifier (added in PHP 5.1.0) Examples: UTC, GMT, Atlantic/Azores
    I (capital i) Whether or not the date is in daylight saving time 1 if Daylight Saving Time, 0 otherwise.
    O Difference to Greenwich time (GMT) in hours Example: +0200
    P Difference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3) Example: +02:00
    T Timezone abbreviation Examples: EST, MDT ...
    Z Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. -43200 through 50400
    Full Date/Time --- ---
    c ISO 8601 date (added in PHP 5) 2004-02-12T15:19:21+00:00
    r » RFC 2822 formatted date Example: Thu, 21 Dec 2000 16:01:07 +0200
    U Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) See also time()

    Unrecognized characters in the format string will be printed as-is. The Z format will always return 0 when using gmdate().

    Note: Since this function only accepts integer timestamps the u format character is only useful when using the date_format() function with user based timestamps created with date_create().

  • timestamp

    The optional timestamp parameter is an integer Unix timestamp that defaults to the current local time if a timestamp is not given. In other words, it defaults to the value of time().

Return Values

Returns a formatted date string. If a non-numeric value is used for timestamp , FALSE is returned and an E_WARNING level error is emitted.

See Also

Javascript date

Source

This is the main source of the Javascript version of PHP's date

function date ( format, timestamp ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
    // +      parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: MeEtc (http://yass.meetcweb.com)
    // +   improved by: Brad Touesnard
    // +   improved by: Tim Wiel
    // +   improved by: Bryan Elliott
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: David Randall
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   derived from: gettimeofday
    // %        note 1: Uses global: php_js to store the default timezone
    // *     example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
    // *     returns 1: '09:09:40 m is month'
    // *     example 2: date('F j, Y, g:i a', 1062462400);
    // *     returns 2: 'September 2, 2003, 2:26 am'
    // *     example 3: date('Y W o', 1062462400);
    // *     returns 3: '2003 36 2003'
    // *     example 4: x = date('Y m d', (new Date()).getTime()/1000); // 2009 01 09
    // *     example 4: (x+'').length == 10
    // *     returns 4: true
 
    var jsdate=(
        (typeof(timestamp) == 'undefined') ? new Date() : // Not provided
        (typeof(timestamp) == 'number') ? new Date(timestamp*1000) : // UNIX timestamp
        new Date(timestamp) // Javascript Date()
    ); // , tal=[]
    var pad = function(n, c){
        if( (n = n + "").length < c ) {
            return new Array(++c - n.length).join("0") + n;
        } else {
            return n;
        }
    };
    var _dst = function (t) {
        // Calculate Daylight Saving Time (derived from gettimeofday() code)
        var dst=0;
        var jan1 = new Date(t.getFullYear(), 0, 1, 0, 0, 0, 0);  // jan 1st
        var june1 = new Date(t.getFullYear(), 6, 1, 0, 0, 0, 0); // june 1st
        var temp = jan1.toUTCString();
        var jan2 = new Date(temp.slice(0, temp.lastIndexOf(' ')-1));
        temp = june1.toUTCString();
        var june2 = new Date(temp.slice(0, temp.lastIndexOf(' ')-1));
        var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);
        var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);
 
        if (std_time_offset === daylight_time_offset) {
            dst = 0; // daylight savings time is NOT observed
        }
        else {
            // positive is southern, negative is northern hemisphere
            var hemisphere = std_time_offset - daylight_time_offset;
            if (hemisphere >= 0) {
                std_time_offset = daylight_time_offset;
            }
            dst = 1; // daylight savings time is observed
        }
        return dst;
    };
    var ret = '';
    var txt_weekdays = ["Sunday","Monday","Tuesday","Wednesday",
        "Thursday","Friday","Saturday"];
    var txt_ordin = {1:"st",2:"nd",3:"rd",21:"st",22:"nd",23:"rd",31:"st"};
    var txt_months =  ["", "January", "February", "March", "April",
        "May", "June", "July", "August", "September", "October", "November",
        "December"];
 
    var f = {
        // Day
            d: function(){
                return pad(f.j(), 2);
            },
            D: function(){
                var t = f.l();
                return t.substr(0,3);
            },
            j: function(){
                return jsdate.getDate();
            },
            l: function(){
                return txt_weekdays[f.w()];
            },
            N: function(){
                return f.w() + 1;
            },
            S: function(){
                return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th';
            },
            w: function(){
                return jsdate.getDay();
            },
            z: function(){
                return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0;
            },
 
        // Week
            W: function(){
                var a = f.z(), b = 364 + f.L() - a;
                var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
 
                if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
                    return 1;
                } 
                if(a <= 2 && nd >= 4 && a >= (6 - nd)){
                    nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
                    return date("W", Math.round(nd2.getTime()/1000));
                }
                return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
            },
 
        // Month
            F: function(){
                return txt_months[f.n()];
            },
            m: function(){
                return pad(f.n(), 2);
            },
            M: function(){
                var t = f.F();
                return t.substr(0,3);
            },
            n: function(){
                return jsdate.getMonth() + 1;
            },
            t: function(){
                var n;
                if( (n = jsdate.getMonth() + 1) == 2 ){
                    return 28 + f.L();
                }
                if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
                    return 31;
                }
                return 30;
            },
 
        // Year
            L: function(){
                var y = f.Y();
                return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0;
            },
            o: function(){
                if (f.n() === 12 && f.W() === 1) {
                    return jsdate.getFullYear()+1;
                }
                if (f.n() === 1 && f.W() >= 52) {
                    return jsdate.getFullYear()-1;
                }
                return jsdate.getFullYear();
            },
            Y: function(){
                return jsdate.getFullYear();
            },
            y: function(){
                return (jsdate.getFullYear() + "").slice(2);
            },
 
        // Time
            a: function(){
                return jsdate.getHours() > 11 ? "pm" : "am";
            },
            A: function(){
                return f.a().toUpperCase();
            },
            B: function(){
                // peter paul koch:
                var off = (jsdate.getTimezoneOffset() + 60)*60;
                var theSeconds = (jsdate.getHours() * 3600) +
                                 (jsdate.getMinutes() * 60) +
                                  jsdate.getSeconds() + off;
                var beat = Math.floor(theSeconds/86.4);
                if (beat > 1000) {
                    beat -= 1000;
                }
                if (beat < 0) {
                    beat += 1000;
                }
                if ((String(beat)).length == 1) {
                    beat = "00"+beat;
                }
                if ((String(beat)).length == 2) {
                    beat = "0"+beat;
                }
                return beat;
            },
            g: function(){
                return jsdate.getHours() % 12 || 12;
            },
            G: function(){
                return jsdate.getHours();
            },
            h: function(){
                return pad(f.g(), 2);
            },
            H: function(){
                return pad(jsdate.getHours(), 2);
            },
            i: function(){
                return pad(jsdate.getMinutes(), 2);
            },
            s: function(){
                return pad(jsdate.getSeconds(), 2);
            },
            u: function(){
                return pad(jsdate.getMilliseconds()*1000, 6);
            },
 
        // Timezone
            e: function () {
/*                var abbr='', i=0;
                if (this.php_js && this.php_js.default_timezone) {
                    return this.php_js.default_timezone;
                }
                if (!tal.length) {
                    tal = timezone_abbreviations_list();
                }
                for (abbr in tal) {
                    for (i=0; i < tal[abbr].length; i++) {
                        if (tal[abbr][i].offset === -jsdate.getTimezoneOffset()*60) {
                            return tal[abbr][i].timezone_id;
                        }
                    }
                }
*/
                return 'UTC';
            },
            I: function(){
                return _dst(jsdate);
            },
            O: function(){
               var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
               t = (jsdate.getTimezoneOffset() > 0) ? "-"+t : "+"+t;
               return t;
            },
            P: function(){
                var O = f.O();
                return (O.substr(0, 3) + ":" + O.substr(3, 2));
            },
            T: function () {
/*                var abbr='', i=0;
                if (!tal.length) {
                    tal = timezone_abbreviations_list();
                }
                if (this.php_js && this.php_js.default_timezone) {
                    for (abbr in tal) {
                        for (i=0; i < tal[abbr].length; i++) {
                            if (tal[abbr][i].timezone_id === this.php_js.default_timezone) {
                                return abbr.toUpperCase();
                            }
                        }
                    }
                }
                for (abbr in tal) {
                    for (i=0; i < tal[abbr].length; i++) {
                        if (tal[abbr][i].offset === -jsdate.getTimezoneOffset()*60) {
                            return abbr.toUpperCase();
                        }
                    }
                }
*/
                return 'UTC';
            },
            Z: function(){
               return -jsdate.getTimezoneOffset()*60;
            },
 
        // Full Date/Time
            c: function(){
                return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();
            },
            r: function(){
                return f.D()+', '+f.d()+' '+f.M()+' '+f.Y()+' '+f.H()+':'+f.i()+':'+f.s()+' '+f.O();
            },
            U: function(){
                return Math.round(jsdate.getTime()/1000);
            }
    };
 
    return format.replace(/[\\]?([a-zA-Z])/g, function(t, s){
        if( t!=s ){
            // escaped
            ret = s;
        } else if( f[s] ){
            // a date function exists
            ret = f[s]();
        } else{
            // nothing special
            ret = s;
        }
        return ret;
    });
}

Examples

Currently there are 4 examples

Example 1

This is how you could call date()
date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
And that would return
'09:09:40 m is month'

Example 2

This is how you could call date()
date('F j, Y, g:i a', 1062462400);
And that would return
'September 2, 2003, 2:26 am'

Example 3

This is how you could call date()
date('Y W o', 1062462400);
And that would return
'2003 36 2003'

More about this Project

Download php.js

To easily include it in your code, every function currently available is stored in

Normal

Namespaced What is 'namespaced?'

To download use Right click, Save Link As
Generally the best way is to use a minified version and gzip it


Credits

Respect & awards go to everybody who has contributed in some way so far:

medalmedalBrett Zamir (link) for contributing to:
 array_diff, array_diff_assoc, array_diff_key, array_diff_uassoc, array_diff_ukey, array_fill_keys, array_fill_keys, array_filter, array_intersect, array_intersect_assoc, array_intersect_key, array_intersect_uassoc, array_intersect_ukey, array_keys, array_map, array_merge, array_merge_recursive, array_pop, array_search, array_slice, array_slice, array_splice, array_udiff, array_udiff_assoc, array_udiff_uassoc, array_uintersect, array_uintersect_assoc, array_uintersect_uassoc, array_unique, arsort, arsort, asort, asort, compact, current, each, end, extract, key, krsort, ksort, natcasesort, natcasesort, natsort, natsort, next, pos, prev, reset, rsort, rsort, shuffle, sort, sort, uasort, uasort, uksort, usort, classkit_import, classkit_method_add, classkit_method_copy, classkit_method_redefine, classkit_method_remove, classkit_method_rename, class_exists, get_class_methods, get_class_vars, get_declared_classes, get_object_vars, method_exists, property_exists, ctype_alnum, ctype_alpha, ctype_cntrl, ctype_digit, ctype_graph, ctype_lower, ctype_print, ctype_punct, ctype_space, ctype_upper, ctype_xdigit, date, date, date, date, date_default_timezone_get, date_default_timezone_set, date_parse, gettimeofday, gmdate, gmmktime, gmstrftime, idate, localtime, mktime, strftime, strtotime, timezone_abbreviations_list, timezone_identifiers_list, restore_exception_handler, set_exception_handler, fclose, feof, fgetc, fgetcsv, fgets, fgetss, filemtime, fopen, fpassthru, fread, fseek, ftell, pathinfo, pclose, popen, readfile, rewind, call_user_func, call_user_func_array, create_function, func_get_arg, func_get_args, func_num_args, get_defined_functions, get_defined_functions, register_shutdown_function, assert, assert_options, get_cfg_var, get_defined_constants, get_required_files, getenv, getlastmod, ini_alter, ini_get, ini_get_all, ini_restore, ini_set, php_ini_loaded_file, php_ini_scanned_files, phpversion, putenv, set_time_limit, include, include_once, require, require_once, atan2, expm1, fmod, log1p, rand, constant, define, defined, die, exit, exit, php_strip_whitespace, sleep, time_nanosleep, time_sleep_until, usleep, gopher_parsedir, setrawcookie, aggregate, aggregate_info, aggregate_methods, aggregate_methods_by_list, aggregate_methods_by_regexp, aggregate_properties, aggregate_properties_by_list, aggregate_properties_by_regexp, aggregation_info, deaggregate, preg_grep, sql_regcase, runkit_class_adopt, runkit_class_emancipate, runkit_function_add, runkit_function_copy, runkit_function_redefine, runkit_function_remove, runkit_function_rename, runkit_import, runkit_method_add, runkit_method_copy, runkit_method_redefine, runkit_method_remove, runkit_method_rename, runkit_superglobals, chunk_split, convert_uuencode, count_chars, echo, get_html_translation_table, lcfirst, levenshtein, localeconv, md5, md5_file, nl2br, nl_langinfo, parse_str, printf, quoted_printable_decode, quoted_printable_decode, quoted_printable_encode, setlocale, sha1, soundex, sprintf, str_getcsv, str_ireplace, str_replace, str_replace, str_shuffle, str_split, str_word_count, strcoll, strcspn, strip_tags, strlen, strnatcasecmp, strncmp, strrchr, strspn, strtok, strtr, substr_compare, substr_replace, ucfirst, vprintf, base64_decode, get_headers, get_meta_tags, parse_url, rawurldecode, rawurldecode, rawurlencode, rawurlencode, rawurlencode, urldecode, urldecode, urlencode, urlencode, doubleval, get_defined_vars, get_resource_type, gettype, import_request_variables, import_request_variables, is_array, is_array, is_binary, is_buffer, is_callable, is_real, is_resource, is_unicode, print_r, print_r, settype, strval, strval, unserialize, var_dump, var_export, utf8_decode
spacemedalOnno Marsman for contributing to:
 acos, acosh, asin, asinh, atan, atanh, ceil, cos, cosh, decbin, dechex, decoct, exp, floor, fmod, getrandmax, hypot, is_finite, is_infinite, is_nan, lcg_value, log, log10, max, max, min, min, mt_getrandmax, mt_rand, pi, pow, rand, round, sin, sinh, sqrt, tan, tanh, setcookie, preg_quote, addslashes, bin2hex, count_chars, html_entity_decode, htmlentities, htmlspecialchars_decode, levenshtein, ltrim, nl2br, nl2br, ord, parse_str, rtrim, soundex, str_ireplace, str_replace, str_replace, str_rot13, str_split, strcasecmp, strip_tags, stripos, stripslashes, stristr, strlen, strnatcmp, strncasecmp, strpbrk, strpos, strrev, strripos, strrpos, strstr, strtolower, strtoupper, substr, substr_count, trim, ucfirst, ucwords, base64_decode, empty, empty, is_array, is_bool, isset, utf8_decode, utf8_encode, utf8_encode
spacemedalMichael White (link) for contributing to:
 array_count_values, get_included_files, include, include_once, require, require_once, md5, number_format, parse_str, printf, sha1, sprintf, str_pad, strnatcmp, vprintf, http_build_query, floatval, is_object, print_r
spacemedalWaldo Malqui Silva for contributing to:
 array_fill, array_pad, array_product, array_rand, compact, count, range, abs, defined, ip2long, long2ip, implode, strcmp, strncmp, ucwords, settype
spacemedalPaulo Ricardo F. Santos for contributing to:
 getdate, microtime, constant, define, chop, chunk_split, quotemeta, sprintf, get_headers, gettype, is_double, is_float, is_integer, is_long, is_scalar
spacemedalJack for contributing to:
 compact, max, min, count_chars, htmlentities, md5, parse_str, soundex, sprintf, str_ireplace, strnatcmp, trim, utf8_encode
spacemedalJonas Raoni Soares Silva (link) for contributing to:
 shuffle, abs, setcookie, number_format, number_format, soundex, str_repeat, str_replace, str_rot13, ucwords, wordwrap, wordwrap
spacemedalPhilip Peterson for contributing to:
 sizeof, log10, round, exit, echo, get_html_translation_table, nl2br, str_replace, strchr, urldecode, urlencode, var_export
spacemedalAtes Goral (link) for contributing to:
 array_change_key_case, array_count_values, array_diff_key, each, get_class, preg_quote, addslashes, count_chars, str_rot13, stripslashes
spacemedalLegaev Andrey for contributing to:
 end, reset, file, file_get_contents, function_exists, include, include_once, http_build_query, is_array, is_object
spacemedalMartijn Wieringa for contributing to:
 array_shift, array_unshift, str_ireplace, str_split, strcasecmp, stripos, strnatcmp, substr
spacemedalNate for contributing to:
 array_merge, array_sum, array_unique, pathinfo, addslashes, echo, strncasecmp
spacemedalEnrique Gonzalez for contributing to:
 file_exists, filesize, decbin, decoct, deg2rad, rad2deg
spacemedalPhilippe Baumann for contributing to:
 base_convert, bindec, dechex, hexdec, octdec, empty
spacemedalTheriault for contributing to:
 array_multisort, quoted_printable_decode, quoted_printable_decode, quoted_printable_encode, quoted_printable_encode
spacemedalWebtoolkit.info (link) for contributing to:
 crc32, md5, sha1, utf8_decode, utf8_encode
 
spacemedalAsh Searle (link) for contributing to:
 basename, printf, sprintf, vprintf
spacemedalCarlos R. L. Rodrigues (link) for contributing to:
 array_chunk, array_unique, date, levenshtein
spacemedalJani Hartikainen for contributing to:
 file, file_exists, file_get_contents, filesize
spacemedalOle Vrijenhoek for contributing to:
 convert_uuencode, convert_uuencode, quoted_printable_decode, str_word_count
spacemedaltravc for contributing to:
 rawurldecode, rawurlencode, urldecode, urlencode
spacemedalAlex for contributing to:
 get_html_translation_table, strip_tags, is_int
spacemedalAndrea Giammarchi (link) for contributing to:
 array_map, define, levenshtein
spacemedalErkekjetter for contributing to:
 ltrim, rtrim, trim
spacemedalGeekFG (link) for contributing to:
 krsort, ksort, time
spacemedalJohnny Mast (link) for contributing to:
 array_walk, array_walk_recursive, create_function
spacemedalMichael Grier for contributing to:
 array_unique, wordwrap, rawurlencode
spacemedald3x for contributing to:
 array, explode, unserialize
spacemedalmarrtins for contributing to:
 array_change_key_case, addslashes, stripslashes
spacemedalstag019 for contributing to:
 parse_str, parse_str, http_build_query
spacemedalAJ for contributing to:
 urldecode, urlencode
spacemedalAlfonso Jimenez (link) for contributing to:
 array_reduce, strpbrk
spacemedalAman Gupta for contributing to:
 base64_decode, utf8_decode
spacemedalArpad Ray (mailto:arpad@php.net) for contributing to:
 serialize, unserialize
spacemedalBreaking Par Consulting Inc (link) for contributing to:
 gettimeofday, localtime
spacemedalCaio Ariede (link) for contributing to:
 strtotime, strtotime
spacemedalDavid for contributing to:
 strtotime, is_numeric
spacemedalJosh Fraser (link) for contributing to:
 gettimeofday, localtime
spacemedalKELAN for contributing to:
 get_html_translation_table, gettype
spacemedalKarol Kowalski for contributing to:
 array_reverse, abs
spacemedalLars Fischer for contributing to:
 urldecode, urlencode
spacemedalMarc Palau for contributing to:
 mktime, strip_tags
spacemedalMirek Slugen for contributing to:
 htmlspecialchars, htmlspecialchars_decode
spacemedalOleg Eremeev for contributing to:
 str_replace, str_replace
spacemedalPellentesque Malesuada for contributing to:
 base64_decode, base64_encode
spacemedalPublic Domain (link) for contributing to:
 json_decode, json_encode
spacemedalSakimori for contributing to:
 strlen, wordwrap
spacemedalSteve Hilder for contributing to:
 strcmp, strncmp
spacemedalSteven Levithan (link) for contributing to:
 trim, parse_url
spacemedalThunder.m for contributing to:
 base64_decode, base64_encode
spacemedalTyler Akins (link) for contributing to:
 base64_decode, base64_encode
spacemedalgettimeofday for contributing to:
 date, idate
spacemedalgorthaur for contributing to:
 strcmp, strncmp
spacemedalmdsjack (link) for contributing to:
 include, trim
spacemedal0m3r for contributing to:
 array_diff_assoc
spacemedalAlexander Ermolaev (link) for contributing to:
 trim
spacemedalAllan Jensen (link) for contributing to:
 number_format
spacemedalAndreas for contributing to:
 setcookie
spacemedalAndrej Pavlovic for contributing to:
 serialize
spacemedalAnton Ongson for contributing to:
 str_replace
spacemedalArno for contributing to:
 htmlspecialchars
spacemedalAtli Þór for contributing to:
 nl2br
spacemedalBayron Guevara for contributing to:
 base64_encode
spacemedalBen Bryan for contributing to:
 print_r
spacemedalBenjamin Lupton for contributing to:
 number_format
spacemedalBlues (link) for contributing to:
 strftime
spacemedalBlues at link for contributing to:
 setlocale
spacemedalBobby Drake for contributing to:
 strip_tags
spacemedalBrad Touesnard for contributing to:
 date
spacemedalBryan Elliott for contributing to:
 date
spacemedalCagri Ekin for contributing to:
 parse_str
spacemedalChaosNo1 for contributing to:
 timezone_abbreviations_list
spacemedalChristian Doebler for contributing to:
 sleep
spacemedalCord for contributing to:
 is_array
spacemedalDaniel Esteban for contributing to:
 strpos
spacemedalDavid James for contributing to:
 get_class
spacemedalDavid Randall for contributing to:
 date
spacemedalDer Simon (link) for contributing to:
 echo
spacemedalDino for contributing to:
 serialize
spacemedalDiogo Resende for contributing to:
 number_format
spacemedalDouglas Crockford (link) for contributing to:
 gettype
spacemedalDxGx for contributing to:
 trim
spacemedalEric Nagel for contributing to:
 strip_tags
spacemedalEugene Bulkin (link) for contributing to:
 echo
spacemedalFGFEmperor for contributing to:
 mktime
spacemedalFelix Geisendoerfer (link) for contributing to:
 array_key_exists
spacemedalFrancesco for contributing to:
 empty
spacemedalFrancois for contributing to:
 htmlspecialchars_decode
spacemedalFremyCompany for contributing to:
 isset
spacemedalGabriel Paderni for contributing to:
 str_replace
spacemedalGaragoth for contributing to:
 serialize
spacemedalGilbert for contributing to:
 array_sum
spacemedalHoward Yeend for contributing to:
 number_format
spacemedalHyam Singer (link) for contributing to:
 exit
spacemedalJ A R for contributing to:
 end
spacemedalJalal Berrami for contributing to:
 import_request_variables
spacemedalKirk Strobeck for contributing to:
 strlen
spacemedalKristof Coomans (SCK-CEN (Belgian Nucleair Research Centre)) for contributing to:
 strnatcasecmp
spacemedalLH for contributing to:
 empty
spacemedalLeslie Hoare for contributing to:
 rand
spacemedalLincoln Ramsay for contributing to:
 basename
spacemedalLinuxworld for contributing to:
 bin2hex
spacemedalLuke Godfrey for contributing to:
 strip_tags
spacemedalLuke Smith (link) for contributing to:
 number_format
spacemedalManish for contributing to:
 is_array
spacemedalMarc Jansen for contributing to:
 empty
spacemedalMarco for contributing to:
 get_html_translation_table
spacemedalMartin Pool for contributing to:
 strnatcasecmp
spacemedalMateusz "loonquawl" Zalega for contributing to:
 htmlspecialchars_decode
spacemedalMatt Bradley for contributing to:
 is_int
spacemedalMeEtc (link) for contributing to:
 date
spacemedalMick@el for contributing to:
 stripslashes
spacemedalNathan for contributing to:
 htmlspecialchars
spacemedalNick Callen for contributing to:
 wordwrap
spacemedalNorman "zEh" Fuchs for contributing to:
 utf8_decode
spacemedalOle Vrijenhoek (link) for contributing to:
 filemtime
spacemedalOzh for contributing to:
 dirname
spacemedalPaul for contributing to:
 exit
spacemedalPedro Tainha (link) for contributing to:
 unserialize
spacemedalPeter-Paul Koch (link) for contributing to:
 date
spacemedalPierre-Luc Paour for contributing to:
 strnatcasecmp
spacemedalPul for contributing to:
 strip_tags
spacemedalPyerre for contributing to:
 checkdate
spacemedalReverseSyntax for contributing to:
 htmlspecialchars_decode
spacemedalRival for contributing to:
 number_format
spacemedalRobin for contributing to:
 is_nan
spacemedalSanjoy Roy for contributing to:
 array_diff
spacemedalSaulo Vallory for contributing to:
 strncasecmp
spacemedalScott Cariss for contributing to:
 htmlspecialchars_decode
spacemedalSimon Willison (link) for contributing to:
 str_replace
spacemedalSlawomir Kaniecki for contributing to:
 htmlspecialchars_decode
spacemedalSoren Hansen for contributing to:
 count
spacemedalSteve Clay for contributing to:
 function_exists
spacemedalSubhasis Deb for contributing to:
 array_merge_recursive
spacemedalT. Wild for contributing to:
 filesize
spacemedalT.Wild for contributing to:
 substr
spacemedalT0bsn for contributing to:
 crc32
spacemedalThiago Mata (link) for contributing to:
 call_user_func_array
spacemedalTim Wiel for contributing to:
 date
spacemedalTim de Koning for contributing to:
 is_numeric
spacemedalTod Gentille for contributing to:
 log10
spacemedalValentina De Rosa for contributing to:
 strspn
spacemedalVictor for contributing to:
 ip2long
spacemedalWagner B. Soares for contributing to:
 strtotime
spacemedalXoraX (link) for contributing to:
 dirname
spacemedalYUI Library: link for contributing to:
 setlocale
spacemedalYannoo for contributing to:
 mktime
spacemedalYves Sucaet for contributing to:
 utf8_encode
spacemedalbaris ozdil for contributing to:
 mktime
spacemedalbooeyOH for contributing to:
 preg_quote
spacemedalclass_exists for contributing to:
 get_declared_classes
spacemedaldate for contributing to:
 idate
spacemedaldjmix for contributing to:
 basename
spacemedaldptr1988 for contributing to:
 unserialize
spacemedalduncan for contributing to:
 array_unique
spacemedalecho is bad for contributing to:
 echo
spacemedalejsanders for contributing to:
 vsprintf
spacemedalgabriel paderni for contributing to:
 mktime
spacemedalger for contributing to:
 html_entity_decode
spacemedalhitwork for contributing to:
 utf8_decode
spacemedaljakes for contributing to:
 mktime
spacemedaljohn (link) for contributing to:
 html_entity_decode
spacemedaljohnrembo for contributing to:
 var_export
spacemedalkenneth for contributing to:
 explode
spacemedalmadipta for contributing to:
 get_html_translation_table
spacemedalmarc andreu for contributing to:
 html_entity_decode
spacemedalmetjay for contributing to:
 time
spacemedalmk.keck for contributing to:
 realpath
spacemedalmktime for contributing to:
 gmmktime
spacemedalnobbler for contributing to:
 htmlentities
spacemedalnoname for contributing to:
 get_html_translation_table
spacemedalpenutbutterjelly for contributing to:
 str_ireplace
spacemedalrezna for contributing to:
 stripslashes
spacemedalsankai for contributing to:
 array_count_values
spacemedalsetcookie for contributing to:
 setrawcookie
spacemedalsowberry for contributing to:
 utf8_encode
spacemedalstensi for contributing to:
 intval
spacemedalstrcasecmp, strcmp for contributing to:
 substr_compare
spacemedaltaith for contributing to:
 is_numeric
spacemedaluestla for contributing to:
 strtr

Your name here?

Contributing is as easy as adding a comment with better code, or code for a new function.
Any contribution leading to improvement will directly get your name & link here.


Coming Project features

Project features that we are currently working on:

  • Done - Site. A place for php.js of it's own. See: phpjs.org.
  • Done - Compile. Compile your own php.js version, with only the functions you need. Should generate a hash with which you can retrieve latest versions of your php.js combination.
  • Done - Testsuite. A better test-suite that can be ran locally so developers can easily test before commiting. Also the testing itself should be more thorough.
  • Done - Versioning. Individual functions are versioned, but the entire library should be versioned as well.

Stay up to date

You can track my blog rss articles and rss comments. You may also find my rss bookmarks interesting. Or twitter Follow me on Twitter


Like this article?

   Then Dzone it!
Or use another bookmark button below to show your support &
help me spread the word.


tags: programming, php, javascript
category: Programming - Javascript - PHP equivalents
read: 12,480 times

Add Comment

PHP.JS is outgroing this blog and moving to it's own space. Please leave your comment here: http://phpjs.org/functions/date

Comments

#32. Kevin on 13 January 2009

Member avatar: Kevin@ David Randall: I had no issues running your 3rd example in our testsuite. Maybe it's browser-specific? I've added your code anyway, because it doesn't hurt any other testcase, and I agree that your 3rd example should work. Thanks for contributing!

#31. David Randall on 10 January 2009

Gravatar.com: David RandallRather than strictly adhering to the PHP version for the 2nd argument, I suggest checking for the Javascript Date() object. Consider the following:

date('Y m d'); // 2009 01 09
date('Y m d', time()); // 2009 01 09
date('Y m d', new Date()); // 40996 08 16
date('Y m d', (new Date()).getTime()/1000); // 2009 01 09
(new Date()).getTime()/1000; // 1231560959.38
time(); // 1231560959


The third line doesn’t produce the correct value because date() is expecting an integer as the 2nd argument. To make this easier for Javascript dates, I suggest changing the following

var a, jsdate=((timestamp) ? new Date(timestamp*1000) : new Date());


to

var a, jsdate=(
(typeof(timestamp) == 'undefined') ? new Date() : // Not provided
(typeof(timestamp) == 'number') ? new Date(timestamp*1000) : // UNIX timestamp
new Date(timestamp) // Javascript Date()
);

#30. Kevin on 07 January 2009

Member avatar: Kevin@ Brett Zamir: Excellent Work Brett, amazing that we have the date function almost complete! Thx

#29. Brett Zamir on 07 January 2009

Gravatar.com: Brett ZamirSorry, meant to post my last comment over at PHP JS Namespaced instead...

#28. Brett Zamir on 07 January 2009

Gravatar.com: Brett ZamirDespite my comment just now about not porting list(), if you can make a small exception for working around the desire to copy PHP behavior perfectly, the following will work if the last argument is the array to be assigned to list() instead of as an assignment (list is a language construct and not a function anyways):

// Only works in global context
list('drink', 'color', 'power', ['coffee', 'brown', 'caffeine']);
function list () {
var arr = arguments[arguments.length-1]
for (var i=0; i < arr.length; i++) {
this[arguments[i]] = arr[i];
}
}
alert(drink +' is '+color+' and '+power +' makes it special.\n'); // Example from PHP manual

#27. Brett Zamir on 07 January 2009

Gravatar.com: Brett ZamirHere's 'o' with some tests confirming it works (I tested the others too)

alert(date('Y W o', Date.UTC(2008,11,28)/1000)) // normal 
alert(date('Y W o', Date.UTC(2008,11,29)/1000))
alert(date('Y W o', Date.UTC(2011,0, 3)/1000))
alert(date('Y W o', Date.UTC(2010,0, 3)/1000))
alert(date('Y W o', Date.UTC(2010,0, 4)/1000)) // normal


o: function(){
if (f.n() === 12 && f.W() === 1) {
return jsdate.getFullYear()+1;
}
if (f.n() === 1 && f.W() >= 52) {
return jsdate.getFullYear()-1;
}
return jsdate.getFullYear();
},


Now, it looks like we only have the timezone identifiers, 'e' and 'T' left to do.

#26. Brett Zamir on 07 January 2009

Gravatar.com: Brett ZamirHere's one more...

Thanks for the idea to check the source code. It gave this one away...

r: function(){
return f.D()+', '+f.d()+' '+f.M()+' '+f.Y()+' '+f.H()+':'+f.i()+':'+f.s()+' '+f.O();
},

#25. Brett Zamir on 07 January 2009

Gravatar.com: Brett ZamirTwo small additions:

u: function(){
return pad(jsdate.getMilliseconds()*1000, 6);
},

Z: function(){
var t = -jsdate.getTimezoneOffset()*60;
return t;
},


Note also that your chart should change the description of 'u' from "milliseconds" to "microseconds" per the current PHP documentation for date().

#24. Kevin on 06 January 2009

Member avatar: Kevin@ Bryan Elliott: Thanks a lot Bryan!

#23. Bryan Elliott on 06 January 2009

Gravatar.com: Bryan ElliottImplementation of I:

I: function(){
var
DST = (new Date(jsdate.getFullYear(),6,1,0,0,0)),
DST = DST.getHours()-DST.getUTCHours(),
ref = jsdate.getHours()-jsdate.getUTCHours();
return ref!=DST?1:0;
},

#22. Kevin on 22 May 2008

Member avatar: Kevin@ Bob: Thanks. Maybe you could use js' native getTimezoneOffset()/60 ?

#21. Bob on 21 May 2008

Default avatar:BobVery interesting project. I came across your date function while looking for an easy way to detect a user's local timezone abbreviation. But your timezone options don't appear to work yet. Is that a known issue? Any other suggestions?

#20. Kevin on 11 April 2008

Member avatar: Kevin@ Tim Wiel: Thanks alot for sharing your improvement Tim!

#19. Tim Wiel on 11 April 2008

Default avatar:Tim WielCalling

$PHP_JS.date();
doesn't return todays date in Mozilla Firefox 2.0.13 on Ubuntu Linux

To fix it I changed the line reading

jsdate = new Date(timestamp ? timestamp * 1000 : null);


to read

jsdate=((timestamp) ? new Date(timestamp*1000) : new Date())

#18. Michael White on 06 March 2008

Default avatar:Michael WhiteHaha, that's ok. I can't pretend that it isn't confusing. I guessed correctly the first time way back at the beginning of this saga but it took me a little while and a bit of research into the subject before I really was able to wrap my head around it. :)

#17. Kevin on 05 March 2008

Member avatar: KevinYeah it does. That's actually what I meant before but the UTC being a 'Universal Time' got me all confused again ;) Time problems tend to do that to me :)

#16. Michael White on 05 March 2008

Default avatar:Michael WhiteAccording the epoch definition it makes complete sense that our time zones would affect the output of what appears to be the same date. Explanation below.


For our purposes: UTC = GMT && GMT = UTC // They never differ by more than 0.9 seconds

... [more]
If the epoch was set in UTC time then UTC +1 = CET (your time zone). That means that 00000 seconds in UTC time is equal to 03600 seconds in CET time.


That also means that 00000 seconds in UTC time is equal to -18000 seconds in EST (my time zone).


The final result is that any given point in UNIX epoch time is exactly 21600 seconds different between our time zones (6 hours) which will yield a different date for the same epoch second depending on your time zone.


Layman's terms: UNIX epoch uses UTC zone as "home". If you "travel" outside that zone then you have to take that difference into account. When it was midnight January 1st, 1970 in the UTC zone it was still December 31st here in my time zone. Therefore the "0" second of the UNIX epoch will represent the date Dec. 31, 1969 for EST and will read correctly for you since it was already Jan. 1st 1970 in CET when the unix epoch was set.


I think that out of those explanations you should find one that makes sense to you.

#15. Kevin on 05 March 2008

Member avatar: Kevin@ Michael White: Google FTW indeed :) Still curious why we're experiencing the difference then though.

#14. Michael White on 05 March 2008

Default avatar:Michael WhiteHaha! Yay for Google and Wikipedia: http://en.wikipedia.org/wiki/Unix_time


In the first paragraph on that page it says that the epoch is "the number of seconds elapsed since midnight Coordinated Universal Time(UTC) of January 1, 1970, not counting leap seconds" which means that the epoch is in fact a single, non-relative point in time rather than a point in time relative to the time zones (since UTC time is always UTC time even if you are in Australia). I think the definition is a hundred percent more clear than my jumbled explanation of it! haha

#13. Michael White on 05 March 2008

Default avatar:Michael WhiteI'm not sure about that (but I could be wrong). The reason is because if the epoch was relative to time zones then the seconds since that time would not be affected by the time zones. Example: If epoch 0000000 were based on time zones then 50000 seconds after that would have the same exact date and time output no matter what time zone you were in. However, if the epoch is a single point in time across the entire world regardless of time zone then 50000 seconds after the epoch for your time zone would then be 6 hours different (date/time wise) than 50000 seconds after the epoch in my time zone. I think that's logically correct but this topic is bending my brain a little bit. Maybe I should just Google it. :)

#12. Kevin on 04 March 2008

Member avatar: Kevin@ Michael White: epoch is seconds since januari 1st 1970 00:00. I think for you, that moment (epoch) happened that's 6 hours later than for me. Time is relative so epoch is too. I hope I make sense as well ;)

@ Brad Touesnard: Thanks alot I will process your fix tomorrow!

#11. Brad Touesnard on 04 March 2008

Default avatar:Brad TouesnardThere's a bug in the f.M() function. It should be t = f.F(); instead of t = f.n();

Great project, keep it up!

#10. Michael White on 04 March 2008

Default avatar:Michael WhiteNow to figure out how to write a test scenario that isn't affected by differences from the GMT.... If it even makes sense to do so, which it may not since the functions that rely on the UNIX epoch seem to work correctly other than the actual time difference between locales. It seems to me as if the UNIX epoch ignores timezones itself so that it calculates the correct date/time anywhere around the world at an exact moment in time rather than a relative moment in time (relative to a timezone). I hope I am making sense here.

#9. Kevin on 03 March 2008

Member avatar: KevinMichael White: I'm Amsterdam GMT +1 CET.
So that seems to be the 6 hours difference we're experiencing! I had never realized that this would have impact on UNIX epoch. Apparently it does :(

#8. Michael White on 03 March 2008

Default avatar:Michael WhiteI believe it just might... but it shouldn't... should it?

My Time Zone is GMT -5 (Eastern Standard Time) I live in Atlanta, Georgia (United States of course). What's your timezone? I noticed it was quite a bit different from mine because I posted a comment around 8 PM on March 2nd and it posted as March 3rd.

Ah! Actually, I have an idea. When I get a chance I am going to calculate the difference between your timezone and mine in seconds since the epoch. Then we can check that difference against the difference we get out of this function to make sure it is just a timezone difference and not a bug.

#7. Kevin on 02 March 2008

Member avatar: KevinHere's mine:

<?php
echo "date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400)"."
"
;
echo date('H:m:s \m \i\s \m\o\n\t\h', 1062402400)."
"
;
 
echo "mktime( 14, 10, 2, 2, 1, 2008 )"."
"
;
echo mktime( 14, 10, 2, 2, 1, 2008 )."
"
;
?>


This boggles me, could it have anything to do with timezones & locales?

#6. Michael White on 02 March 2008

Default avatar:Michael WhiteVERY strange.... I bet it has something to do with the PHP version installed on different servers. I have tested on my local server as well as on a shared host (both are PHP5).

The one hosted on the shared host is here:

http://sprinkit.net/aether/test.php

<?php
 
echo "date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400)";
echo "
"
;
echo date('H:m:s \m \i\s \m\o\n\t\h', 1062402400);#09:09:40 m is month
echo "
"
;
 
 
echo "mktime( 14, 10, 2, 2, 1, 2008 )";
echo "
"
;
echo mktime( 14, 10, 2, 2, 1, 2008 );
 
 
?>


That is the exact code I used to duplicate your test.php page. I assume it is identical as far as process.

Anyway - I noticed these on the php.js test page because they turned red when I ran them. The whole page fails to run in IE 7, IE 6, and Safari 3; it just hangs. It runs in Opera 9 and FF2 (win & mac) and in all three browser where it works I get red box with the output matching that of my PHP test page. When I ran my own tests while creating the namespaced version I found that IE 7, IE 6, and Safari 3 also produce the same output (matching my PHP test page).

#5. Kevin on 02 March 2008

Member avatar: Kevin@ Michael White: Tried to reproduce the behavior, but wasn't able to:
http://kevin.vanzonneveld.net/test.php

#4. Michael White on 02 March 2008

Default avatar:Michael WhiteThe example results are incorrect for this function ( I double checked it by running it in PHP itself).

The new examples are:

// *     example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
// * returns 1: '03:09:40 m is month'
// * example 2: date('F j, Y, g:i a', 1062462400);
// * returns 2: 'September 1, 2003, 8:26 pm'


http://crestidg.com

#3. Kevin on 12 February 2008

Member avatar: Kevin@ Adam (MeEtc): I've updated the credits!

#2. Kevin on 12 February 2008

Member avatar: Kevin@ Adam: Thanks a lot for not only pointing this out, but also for taking the extra effort to provide the fixes. Appreciated!

#1. Adam on 12 February 2008

Default avatar:AdamI have been trying to use this date function in a project of mine using JScript, and have encountered a few difficulties.

The first problem I encountered was that when using either F or M for a month, The function will show the month in advance. m still shows the correct numerical value however. The reason this happens is that the array created with the constants for the months is zero-based. Adding an empty sting before "January" fixes this.

var txt_months =  ["","January", "February", "March", "April",
"May", "June", "July", "August", "September", "October", "November",
"December"];


Next problem was that P was giving me an error
Error: Object doesn't support this property or method (code: -2146827850)
File: php.date.js. Line: 197.

Line 197 is "var O = jsdate.O();" within the function for P. First, jsdate.O() should be f.O(). Then comes the problem that the function O does not output the correct output. I have re-written the function for O so it produces the correct output:
O: function(){
var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;
return t;
}


Finally, the function U is missing the return keyword.


Cheers,
Adam