/* * More info at: http://phpjs.org * * This is version: 2.71 * php.js is copyright 2009 Kevin van Zonneveld. * * Portions copyright Brett Zamir (http://brett-zamir.me), Kevin van Zonneveld * (http://kevin.vanzonneveld.net), Onno Marsman, Michael White * (http://getsprink.com), Waldo Malqui Silva, Paulo Ricardo F. Santos, Jack, * Philip Peterson, Jonas Raoni Soares Silva (http://www.jsfromhell.com), * Legaev Andrey, Ates Goral (http://magnetiq.com), Martijn Wieringa, Nate, * Enrique Gonzalez, Philippe Baumann, Webtoolkit.info * (http://www.webtoolkit.info/), Theriault, Jani Hartikainen, Ash Searle * (http://hexmen.com/blog/), Carlos R. L. Rodrigues * (http://www.jsfromhell.com), Ole Vrijenhoek, travc, Michael Grier, GeekFG * (http://geekfg.blogspot.com), Johnny Mast (http://www.phpvrouwen.nl), Alex, * d3x, stag019, Andrea Giammarchi (http://webreflection.blogspot.com), * marrtins, Erkekjetter, Steve Hilder, Oleg Eremeev, David, Marc Palau, * Steven Levithan (http://blog.stevenlevithan.com), gorthaur, Arpad Ray * (mailto:arpad@php.net), Public Domain (http://www.json.org/json2.js), * gettimeofday, mdsjack (http://www.mdsjack.bo.it), Thunder.m, Alfonso * Jimenez (http://www.alfonsojimenez.com), KELAN, Tyler Akins * (http://rumkin.com), Mirek Slugen, Kankrelune * (http://www.webfaktory.info/), Karol Kowalski, AJ, Lars Fischer, Caio * Ariede (http://caioariede.com), Aman Gupta, Sakimori, Pellentesque * Malesuada, Breaking Par Consulting Inc * (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CFB006C45F7), * Josh Fraser * (http://onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/), * Paul, madipta, Douglas Crockford (http://javascript.crockford.com), Ole * Vrijenhoek (http://www.nervous.nl/), Hyam Singer * (http://www.impact-computing.com/), Raphael (Ao RUDLER), kenneth, T. Wild, * nobbler, class_exists, noname, Marco, David James, Steve Clay, marc andreu, * ger, john (http://www.jd-tech.net), mktime, Brad Touesnard, J A R, djmix, * Lincoln Ramsay, Linuxworld, Thiago Mata (http://thiagomata.blog.com), * Pyerre, Jon Hohle, Bayron Guevara, duncan, Sanjoy Roy, sankai, 0m3r, Felix * Geisendoerfer (http://www.debuggable.com/felix), Gilbert, Subhasis Deb, * Soren Hansen, T0bsn, Eugene Bulkin (http://doubleaw.com/), Der Simon * (http://innerdom.sourceforge.net/), JB, LH, Marc Jansen, Francesco, echo is * bad, XoraX (http://www.xorax.info), MeEtc (http://yass.meetcweb.com), * Peter-Paul Koch (http://www.quirksmode.org/js/beat.html), Nathan, Tim Wiel, * Ozh, David Randall, Bryan Elliott, Jalal Berrami, Arno, Rick Waldron, * Mick@el, rezna, Kirk Strobeck, Martin Pool, Daniel Esteban, Saulo Vallory, * Kristof Coomans (SCK-CEN Belgian Nucleair Research Centre), Pierre-Luc * Paour, Eric Nagel, Bobby Drake, penutbutterjelly, Christian Doebler, * setcookie, Gabriel Paderni, Simon Willison (http://simonwillison.net), Pul, * Luke Godfrey, Blues (http://tech.bluesmoon.info/), Anton Ongson, Jason Wong * (http://carrot.org/), Valentina De Rosa, sowberry, hitwork, Norman "zEh" * Fuchs, Yves Sucaet, johnrembo, Nick Callen, ejsanders, Aidan Lister * (http://aidanlister.com/), Philippe Jausions * (http://pear.php.net/user/jausions), dptr1988, Pedro Tainha * (http://www.pedrotainha.com), Alan C, uestla, Wagner B. Soares, T.Wild, * strcasecmp, strcmp, DxGx, Alexander Ermolaev * (http://snippets.dzone.com/user/AlexanderErmolaev), ChaosNo1, metjay, YUI * Library: http://developer.yahoo.com/yui/docs/YAHOO.util.DateLocale.html, * Blues at http://hacks.bluesmoon.info/strftime/strftime.js, taith, Robin, * Matt Bradley, Tim de Koning, Luis Salazar (http://www.freaky-media.com/), * FGFEmperor, baris ozdil, Tod Gentille, FremyCompany, Manish, Cord, Slawomir * Kaniecki, ReverseSyntax, Mateusz "loonquawl" Zalega, Scott Cariss, * Francois, Victor, stensi, vlado houba, date, gabriel paderni, Yannoo, * mk.keck, Leslie Hoare, Ben Bryan, Dino, Andrej Pavlovic, Andreas, DtTvB * (http://dt.in.th/2008-09-16.string-length-in-bytes.html), Russell Walker, * Garagoth, booeyOH, Cagri Ekin, Benjamin Lupton, davook, Atli Þór, jakes, * Allan Jensen (http://www.winternet.no), Howard Yeend, Kheang Hok Chin * (http://www.distantia.ca/), Luke Smith (http://lucassmith.name), Rival, * Diogo Resende * * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL KEVIN VAN ZONNEVELD BE LIABLE FOR ANY CLAIM, DAMAGES * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ if ("undefined" == typeof PHPJS) { PHPJS = 1; 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) // + improved by: Theriault // + derived from: gettimeofday // + input by: majak // + bugfixed by: majak // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + input by: Alex // + bugfixed by: Brett Zamir (http://brett-zamir.me) // + improved by: Theriault // + improved by: Brett Zamir (http://brett-zamir.me) // + improved by: Theriault // + improved by: Thomas Beaucourt (http://www.webapp.fr) // + improved by: JT // + improved by: Theriault // + improved by: Rafał Kukawski (http://blog.kukawski.pl) // % note 1: Uses global: php_js to store the default timezone // % note 2: Although the function potentially allows timezone info (see notes), it currently does not set // % note 2: per a timezone specified by date_default_timezone_set(). Implementers might use // % note 2: this.php_js.currentTimezoneOffset and this.php_js.currentTimezoneDST set by that function // % note 2: in order to adjust the dates in this function (or our other date functions!) accordingly // * 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); // * example 4: (x+'').length == 10 // 2009 01 09 // * returns 4: true // * example 5: date('W', 1104534000); // * returns 5: '53' // * example 6: date('B t', 1104534000); // * returns 6: '999 31' // * example 7: date('W U', 1293750000.82); // 2010-12-31 // * returns 7: '52 1293750000' // * example 8: date('W', 1293836400); // 2011-01-01 // * returns 8: '52' // * example 9: date('W Y-m-d', 1293974054); // 2011-01-02 // * returns 9: '52 2011-01-02' var that = this, jsdate, f, formatChr = /\\?([a-z])/gi, formatChrCb, // Keep this here (works, but for code commented-out // below for file size reasons) //, tal= [], _pad = function (n, c) { if ((n = n + "").length < c) { return new Array((++c) - n.length).join("0") + n; } else { return n; } }, txt_words = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], txt_ordin = { 1: "st", 2: "nd", 3: "rd", 21: "st", 22: "nd", 23: "rd", 31: "st" }; formatChrCb = function (t, s) { return f[t] ? f[t]() : s; }; f = { // Day d: function () { // Day of month w/leading 0; 01..31 return _pad(f.j(), 2); }, D: function () { // Shorthand day name; Mon...Sun return f.l().slice(0, 3); }, j: function () { // Day of month; 1..31 return jsdate.getDate(); }, l: function () { // Full day name; Monday...Sunday return txt_words[f.w()] + 'day'; }, N: function () { // ISO-8601 day of week; 1[Mon]..7[Sun] return f.w() || 7; }, S: function () { // Ordinal suffix for day of month; st, nd, rd, th return txt_ordin[f.j()] || 'th'; }, w: function () { // Day of week; 0[Sun]..6[Sat] return jsdate.getDay(); }, z: function () { // Day of year; 0..365 var a = new Date(f.Y(), f.n() - 1, f.j()), b = new Date(f.Y(), 0, 1); return Math.round((a - b) / 864e5) + 1; }, // Week W: function () { // ISO-8601 week number var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3), b = new Date(a.getFullYear(), 0, 4); return 1 + Math.round((a - b) / 864e5 / 7); }, // Month F: function () { // Full month name; January...December return txt_words[6 + f.n()]; }, m: function () { // Month w/leading 0; 01...12 return _pad(f.n(), 2); }, M: function () { // Shorthand month name; Jan...Dec return f.F().slice(0, 3); }, n: function () { // Month; 1...12 return jsdate.getMonth() + 1; }, t: function () { // Days in month; 28...31 return (new Date(f.Y(), f.n(), 0)).getDate(); }, // Year L: function () { // Is leap year?; 0 or 1 var y = f.Y(), a = y & 3, b = y % 4e2, c = y % 1e2; return 0 + (!a && (c || !b)); }, o: function () { // ISO-8601 year var n = f.n(), W = f.W(), Y = f.Y(); return Y + (n === 12 && W < 9 ? -1 : n === 1 && W > 9); }, Y: function () { // Full year; e.g. 1980...2010 return jsdate.getFullYear(); }, y: function () { // Last two digits of year; 00...99 return (f.Y() + "").slice(-2); }, // Time a: function () { // am or pm return jsdate.getHours() > 11 ? "pm" : "am"; }, A: function () { // AM or PM return f.a().toUpperCase(); }, B: function () { // Swatch Internet time; 000..999 var H = jsdate.getUTCHours() * 36e2, // Hours i = jsdate.getUTCMinutes() * 60, // Minutes s = jsdate.getUTCSeconds(); // Seconds return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3); }, g: function () { // 12-Hours; 1..12 return f.G() % 12 || 12; }, G: function () { // 24-Hours; 0..23 return jsdate.getHours(); }, h: function () { // 12-Hours w/leading 0; 01..12 return _pad(f.g(), 2); }, H: function () { // 24-Hours w/leading 0; 00..23 return _pad(f.G(), 2); }, i: function () { // Minutes w/leading 0; 00..59 return _pad(jsdate.getMinutes(), 2); }, s: function () { // Seconds w/leading 0; 00..59 return _pad(jsdate.getSeconds(), 2); }, u: function () { // Microseconds; 000000-999000 return _pad(jsdate.getMilliseconds() * 1000, 6); }, // Timezone e: function () { // Timezone identifier; e.g. Atlantic/Azores, ... // The following works, but requires inclusion of the very large // timezone_abbreviations_list() function. /* return this.date_default_timezone_get(); */ throw 'Not supported (see source code of date() for timezone on how to add support)'; }, I: function () { // DST observed?; 0 or 1 // Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC. // If they are not equal, then DST is observed. var a = new Date(f.Y(), 0), // Jan 1 c = Date.UTC(f.Y(), 0), // Jan 1 UTC b = new Date(f.Y(), 6), // Jul 1 d = Date.UTC(f.Y(), 6); // Jul 1 UTC return 0 + ((a - c) !== (b - d)); }, O: function () { // Difference to GMT in hour format; e.g. +0200 var a = jsdate.getTimezoneOffset(); return (a > 0 ? "-" : "+") + _pad(Math.abs(a / 60 * 100), 4); }, P: function () { // Difference to GMT w/colon; e.g. +02:00 var O = f.O(); return (O.substr(0, 3) + ":" + O.substr(3, 2)); }, T: function () { // Timezone abbreviation; e.g. EST, MDT, ... // The following works, but requires inclusion of the very // large timezone_abbreviations_list() function. /* var abbr = '', i = 0, os = 0, default = 0; if (!tal.length) { tal = that.timezone_abbreviations_list(); } if (that.php_js && that.php_js.default_timezone) { default = that.php_js.default_timezone; for (abbr in tal) { for (i=0; i < tal[abbr].length; i++) { if (tal[abbr][i].timezone_id === default) { return abbr.toUpperCase(); } } } } for (abbr in tal) { for (i = 0; i < tal[abbr].length; i++) { os = -jsdate.getTimezoneOffset() * 60; if (tal[abbr][i].offset === os) { return abbr.toUpperCase(); } } } */ return 'UTC'; }, Z: function () { // Timezone offset in seconds (-43200...50400) return -jsdate.getTimezoneOffset() * 60; }, // Full Date/Time c: function () { // ISO-8601 date. return 'Y-m-d\\Th:i:sP'.replace(formatChr, formatChrCb); }, r: function () { // RFC 2822 return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb); }, U: function () { // Seconds since UNIX epoch return jsdate.getTime() / 1000 | 0; } }; this.date = function (format, timestamp) { that = this; jsdate = ( (typeof timestamp === 'undefined') ? new Date() : // Not provided (timestamp instanceof Date) ? new Date(timestamp) : // JS Date() new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int) ); return format.replace(formatChr, formatChrCb); }; return this.date(format, timestamp); } function mktime() { // Get UNIX timestamp for a date // // version: 1008.1718 // discuss at: http://phpjs.org/functions/mktime // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + improved by: baris ozdil // + input by: gabriel paderni // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + improved by: FGFEmperor // + input by: Yannoo // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + input by: jakes // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfixed by: Marc Palau // + improved by: Brett Zamir (http://brett-zamir.me) // + input by: 3D-GRAF // + bugfixed by: Brett Zamir (http://brett-zamir.me) // + input by: Chris // + revised by: Theriault // % note 1: The return values of the following examples are // % note 1: received only if your system's timezone is UTC. // * example 1: mktime(14, 10, 2, 2, 1, 2008); // * returns 1: 1201875002 // * example 2: mktime(0, 0, 0, 0, 1, 2008); // * returns 2: 1196467200 // * example 3: make = mktime(); // * example 3: td = new Date(); // * example 3: real = Math.floor(td.getTime() / 1000); // * example 3: diff = (real - make); // * results 3: diff < 5 // * example 4: mktime(0, 0, 0, 13, 1, 1997) // * returns 4: 883612800 // * example 5: mktime(0, 0, 0, 1, 1, 1998) // * returns 5: 883612800 // * example 6: mktime(0, 0, 0, 1, 1, 98) // * returns 6: 883612800 // * example 7: mktime(23, 59, 59, 13, 0, 2010) // * returns 7: 1293839999 // * example 8: mktime(0, 0, -1, 1, 1, 1970) // * returns 8: -1 var d = new Date(), r = arguments, i = 0, e = ['Hours', 'Minutes', 'Seconds', 'Month', 'Date', 'FullYear']; for (i = 0; i < e.length; i++) { if (typeof r[i] === 'undefined') { r[i] = d['get' + e[i]](); r[i] += (i === 3); // +1 to fix JS months. } else { r[i] = parseInt(r[i], 10); if (isNaN(r[i])) { return false; } } } // Map years 0-69 to 2000-2069 and years 70-100 to 1970-2000. r[5] += (r[5] >= 0 ? (r[5] <= 69 ? 2e3 : (r[5] <= 100 ? 1900 : 0)) : 0); // Set year, month (-1 to fix JS months), and date. // !This must come before the call to setHours! d.setFullYear(r[5], r[3] - 1, r[4]); // Set hours, minutes, and seconds. d.setHours(r[0], r[1], r[2]); // Divide milliseconds by 1000 to return seconds and drop decimal. // Add 1 second if negative or it'll be off from PHP by 1 second. return (d.getTime() / 1e3 >> 0) - (d.getTime() < 0); } }