js/src/devtools/jint/sunspider/date-format-tofte.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 function arrayExists(array, x) {
     2   /* BEGIN LOOP */
     3     for (var i = 0; i < array.length; i++) {
     4         if (array[i] == x) return true;
     5     }
     6   /* END LOOP */
     7     return false;
     8 }
    10 Date.prototype.formatDate = function (input,time) {
    11     // formatDate :
    12     // a PHP date like function, for formatting date strings
    13     // See: http://www.php.net/date
    14     //
    15     // input : format string
    16     // time : epoch time (seconds, and optional)
    17     //
    18     // if time is not passed, formatting is based on 
    19     // the current "this" date object's set time.
    20     //
    21     // supported:
    22     // a, A, B, d, D, F, g, G, h, H, i, j, l (lowercase L), L, 
    23     // m, M, n, O, r, s, S, t, U, w, W, y, Y, z
    24     //
    25     // unsupported:
    26     // I (capital i), T, Z    
    28     var switches =    ["a", "A", "B", "d", "D", "F", "g", "G", "h", "H", 
    29                        "i", "j", "l", "L", "m", "M", "n", "O", "r", "s", 
    30                        "S", "t", "U", "w", "W", "y", "Y", "z"];
    31     var daysLong =    ["Sunday", "Monday", "Tuesday", "Wednesday", 
    32                        "Thursday", "Friday", "Saturday"];
    33     var daysShort =   ["Sun", "Mon", "Tue", "Wed", 
    34                        "Thu", "Fri", "Sat"];
    35     var monthsShort = ["Jan", "Feb", "Mar", "Apr",
    36                        "May", "Jun", "Jul", "Aug", "Sep",
    37                        "Oct", "Nov", "Dec"];
    38     var monthsLong =  ["January", "February", "March", "April",
    39                        "May", "June", "July", "August", "September",
    40                        "October", "November", "December"];
    41     var daysSuffix = ["st", "nd", "rd", "th", "th", "th", "th", // 1st - 7th
    42                       "th", "th", "th", "th", "th", "th", "th", // 8th - 14th
    43                       "th", "th", "th", "th", "th", "th", "st", // 15th - 21st
    44                       "nd", "rd", "th", "th", "th", "th", "th", // 22nd - 28th
    45                       "th", "th", "st"];                        // 29th - 31st
    47     function a() {
    48         // Lowercase Ante meridiem and Post meridiem
    49         return self.getHours() > 11? "pm" : "am";
    50     }
    51     function A() {
    52         // Uppercase Ante meridiem and Post meridiem
    53         return self.getHours() > 11? "PM" : "AM";
    54     }
    56     function B(){
    57         // Swatch internet time. code simply grabbed from ppk,
    58         // since I was feeling lazy:
    59         // http://www.xs4all.nl/~ppk/js/beat.html
    60         var off = (self.getTimezoneOffset() + 60)*60;
    61         var theSeconds = (self.getHours() * 3600) + 
    62                          (self.getMinutes() * 60) + 
    63                           self.getSeconds() + off;
    64         var beat = Math.floor(theSeconds/86.4);
    65         if (beat > 1000) beat -= 1000;
    66         if (beat < 0) beat += 1000;
    67         if ((""+beat).length == 1) beat = "00"+beat;
    68         if ((""+beat).length == 2) beat = "0"+beat;
    69         return beat;
    70     }
    72     function d() {
    73         // Day of the month, 2 digits with leading zeros
    74         return new String(self.getDate()).length == 1?
    75         "0"+self.getDate() : self.getDate();
    76     }
    77     function D() {
    78         // A textual representation of a day, three letters
    79         return daysShort[self.getDay()];
    80     }
    81     function F() {
    82         // A full textual representation of a month
    83         return monthsLong[self.getMonth()];
    84     }
    85     function g() {
    86         // 12-hour format of an hour without leading zeros
    87         return self.getHours() > 12? self.getHours()-12 : self.getHours();
    88     }
    89     function G() {
    90         // 24-hour format of an hour without leading zeros
    91         return self.getHours();
    92     }
    93     function h() {
    94         // 12-hour format of an hour with leading zeros
    95         if (self.getHours() > 12) {
    96           var s = new String(self.getHours()-12);
    97           return s.length == 1?
    98           "0"+ (self.getHours()-12) : self.getHours()-12;
    99         } else { 
   100           var s = new String(self.getHours());
   101           return s.length == 1?
   102           "0"+self.getHours() : self.getHours();
   103         }  
   104     }
   105     function H() {
   106         // 24-hour format of an hour with leading zeros
   107         return new String(self.getHours()).length == 1?
   108         "0"+self.getHours() : self.getHours();
   109     }
   110     function i() {
   111         // Minutes with leading zeros
   112         return new String(self.getMinutes()).length == 1? 
   113         "0"+self.getMinutes() : self.getMinutes(); 
   114     }
   115     function j() {
   116         // Day of the month without leading zeros
   117         return self.getDate();
   118     }    
   119     function l() {
   120         // A full textual representation of the day of the week
   121         return daysLong[self.getDay()];
   122     }
   123     function L() {
   124         // leap year or not. 1 if leap year, 0 if not.
   125         // the logic should match iso's 8601 standard.
   126         var y_ = Y();
   127         if (         
   128             (y_ % 4 == 0 && y_ % 100 != 0) ||
   129             (y_ % 4 == 0 && y_ % 100 == 0 && y_ % 400 == 0)
   130             ) {
   131             return 1;
   132         } else {
   133             return 0;
   134         }
   135     }
   136     function m() {
   137         // Numeric representation of a month, with leading zeros
   138         return self.getMonth() < 9?
   139         "0"+(self.getMonth()+1) : 
   140         self.getMonth()+1;
   141     }
   142     function M() {
   143         // A short textual representation of a month, three letters
   144         return monthsShort[self.getMonth()];
   145     }
   146     function n() {
   147         // Numeric representation of a month, without leading zeros
   148         return self.getMonth()+1;
   149     }
   150     function O() {
   151         // Difference to Greenwich time (GMT) in hours
   152         var os = Math.abs(self.getTimezoneOffset());
   153         var h = ""+Math.floor(os/60);
   154         var m = ""+(os%60);
   155         h.length == 1? h = "0"+h:1;
   156         m.length == 1? m = "0"+m:1;
   157         return self.getTimezoneOffset() < 0 ? "+"+h+m : "-"+h+m;
   158     }
   159     function r() {
   160         // RFC 822 formatted date
   161         var r; // result
   162         //  Thu    ,     21          Dec         2000
   163         r = D() + ", " + j() + " " + M() + " " + Y() +
   164         //        16     :    01     :    07          +0200
   165             " " + H() + ":" + i() + ":" + s() + " " + O();
   166         return r;
   167     }
   168     function S() {
   169         // English ordinal suffix for the day of the month, 2 characters
   170         return daysSuffix[self.getDate()-1];
   171     }
   172     function s() {
   173         // Seconds, with leading zeros
   174         return new String(self.getSeconds()).length == 1?
   175         "0"+self.getSeconds() : self.getSeconds();
   176     }
   177     function t() {
   179         // thanks to Matt Bannon for some much needed code-fixes here!
   180         var daysinmonths = [null,31,28,31,30,31,30,31,31,30,31,30,31];
   181         if (L()==1 && n()==2) return 29; // leap day
   182         return daysinmonths[n()];
   183     }
   184     function U() {
   185         // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
   186         return Math.round(self.getTime()/1000);
   187     }
   188     function W() {
   189         // Weeknumber, as per ISO specification:
   190         // http://www.cl.cam.ac.uk/~mgk25/iso-time.html
   192         // if the day is three days before newyears eve,
   193         // there's a chance it's "week 1" of next year.
   194         // here we check for that.
   195         var beforeNY = 364+L() - z();
   196         var afterNY  = z();
   197         var weekday = w()!=0?w()-1:6; // makes sunday (0), into 6.
   198         if (beforeNY <= 2 && weekday <= 2-beforeNY) {
   199             return 1;
   200         }
   201         // similarly, if the day is within threedays of newyears
   202         // there's a chance it belongs in the old year.
   203         var ny = new Date("January 1 " + Y() + " 00:00:00");
   204         var nyDay = ny.getDay()!=0?ny.getDay()-1:6;
   205         if (
   206             (afterNY <= 2) && 
   207             (nyDay >=4)  && 
   208             (afterNY >= (6-nyDay))
   209             ) {
   210             // Since I'm not sure we can just always return 53,
   211             // i call the function here again, using the last day
   212             // of the previous year, as the date, and then just
   213             // return that week.
   214             var prevNY = new Date("December 31 " + (Y()-1) + " 00:00:00");
   215             return prevNY.formatDate("W");
   216         }
   218         // week 1, is the week that has the first thursday in it.
   219         // note that this value is not zero index.
   220         if (nyDay <= 3) {
   221             // first day of the year fell on a thursday, or earlier.
   222             return 1 + Math.floor( ( z() + nyDay ) / 7 );
   223         } else {
   224             // first day of the year fell on a friday, or later.
   225             return 1 + Math.floor( ( z() - ( 7 - nyDay ) ) / 7 );
   226         }
   227     }
   228     function w() {
   229         // Numeric representation of the day of the week
   230         return self.getDay();
   231     }
   233     function Y() {
   234         // A full numeric representation of a year, 4 digits
   236         // we first check, if getFullYear is supported. if it
   237         // is, we just use that. ppks code is nice, but wont
   238         // work with dates outside 1900-2038, or something like that
   239         if (self.getFullYear) {
   240             var newDate = new Date("January 1 2001 00:00:00 +0000");
   241             var x = newDate .getFullYear();
   242             if (x == 2001) {              
   243                 // i trust the method now
   244                 return self.getFullYear();
   245             }
   246         }
   247         // else, do this:
   248         // codes thanks to ppk:
   249         // http://www.xs4all.nl/~ppk/js/introdate.html
   250         var x = self.getYear();
   251         var y = x % 100;
   252         y += (y < 38) ? 2000 : 1900;
   253         return y;
   254     }
   255     function y() {
   256         // A two-digit representation of a year
   257         var y = Y()+"";
   258         return y.substring(y.length-2,y.length);
   259     }
   260     function z() {
   261         // The day of the year, zero indexed! 0 through 366
   262         var t = new Date("January 1 " + Y() + " 00:00:00");
   263         var diff = self.getTime() - t.getTime();
   264         return Math.floor(diff/1000/60/60/24);
   265     }
   267     var self = this;
   268     if (time) {
   269         // save time
   270         var prevTime = self.getTime();
   271         self.setTime(time);
   272     }
   274     var ia = input.split("");
   275     var ij = 0;
   276   /* BEGIN LOOP */
   277     while (ia[ij]) {
   278         if (ia[ij] == "\\") {
   279             // this is our way of allowing users to escape stuff
   280             ia.splice(ij,1);
   281         } else {
   282             if (arrayExists(switches,ia[ij])) {
   283                 ia[ij] = eval(ia[ij] + "()");
   284             }
   285         }
   286         ij++;
   287     }
   288   /* END LOOP */
   289     // reset time, back to what it was
   290     if (prevTime) {
   291         self.setTime(prevTime);
   292     }
   293     return ia.join("");
   294 }
   296 var date = new Date("1/1/2007 1:11:11");
   298   /* BEGIN LOOP */
   299 for (i = 0; i < 500; ++i) {
   300     var shortFormat = date.formatDate("Y-m-d");
   301     var longFormat = date.formatDate("l, F d, Y g:i:s A");
   302     date.setTime(date.getTime() + 84266956);
   303 }
   304   /* END LOOP */

mercurial