ありがとうポイントを獲得!!

javascript print()について教えて下さい。
http://oshiete.goo.ne.jp/qa/6320963.html

無視されると思ったのに、「仮面ライダーXのように叫ぼう!」がポイントを獲得した〜!
yyr446 さんを否定し、think49 さんの補足さえもけ散らしてだっ!

gtlt さんに、誉められた「Excellent!」と同等なくらいうれしいかっ?!
今日はお祝いだ〜!(個人的な記念日でもあったらしい。)

Date_parseISO8601String()
正規表現はやっぱり鬼門だ。

http://ja.wikipedia.org/wiki/ISO_8601
http://www.webstore.jsa.or.jp/webstore/PrevPdfServlet?dc=JIS&fn=pre_jis_x_00301_000_000_2002_j_ed10_i4.pdf
意外と複雑だと実感。
現在、徐々に書き足しています。
切り出しは終了。
次はエラーチェック。

<!DOCTYPE html>
<title></title>

<style type="text/css">
table , td {
  border :1px #ccc inset;
}
th {
  border :1px #ccc outset;
  background : #eee;
}
</style>

<body>
<table>
<tr>
<th rowspan="2">DateTime<th>YYYY<th>MM<th>DD<th>HH<th>MN<th>SS<th colspan="18">MS

<tr>
<th>+-<th>ExYYYY<th>YYYY<th>YY<th>MM<th>DD<th>DDD<th>W<th>week<th>Day<th>HH<th>HHd<th>MM<th>MMd<th>DD<th>DDd<th>TZ+-<th>HH<th>MN<th>UTC
<script>
(function () {
  var y = '(?:([+-][0-9]{6})|([0-9]{4})|([0-9]{2}))?';
  var y = '(?:(?:([+-])([0-9]{6}))|([0-9]{4})|([0-9]{2}))?';
  var m = '(?:\\-?([0-1][0-9]))?'
  var d = '(?:\\-?([0-3][0-9]))?';
  var d3= '(?:\\-?([0-3][0-9]{2}))';
  var w = '(?:(W)([0-5][0-9])(?:\\-?([1-7]))?)';
  var hh = '(?:([0-2][0-9])(?:[,\\.]([0-9]+))?)?';
  var mn = '(?::?([0-5][0-9])(?:[,\\.]([0-9]+))?)?';
  var ss = '(?::?([0-6][0-9])(?:[,\\.]([0-9]{3}))?)?';
  var time = '(?:' + hh + mn + ss + ')?';
  var timeZone = '(?:([+-])([0-2][0-9]):?([0-6][0-9]))?(Z)?';

  var date = '^' +y + '(?:' + m + d + '|' + d3 + '|'+ w + ')(?:$|T)'+ time + timeZone + '$';
  var reg_parse_date = new RegExp (date);
  var day_list = [31,28,31,30,31,30,31,31,30,31,30,31];

// all, +-, Y6, Y4, Y2, MM, DD, DDD, W, w2, w1, HH, HHd, MM, MMd, SS, MS, TZ[+-], HH, MM, UTC
//   0,  1,  2,  3,  4,  5,  6,   7, 8,  9, 10, 11,  12, 13,  14, 15, 16,     17, 18, 19,  20
  
  var num = function (str) {
    return str ? Number (str): 0;
  };

  var parse = function (str) {
    var dt;
    var leap_year;
    var start_week;
    var date;
    var max;
    var offset;
    var y, m, w, d, hh, mm, ss, ms;
    var tzhh, tzmm;

    if (! str) return;
    if (! (dt = reg_parse_date.exec (str))) return;

    // 組み合わせとしてありえないもの
    if (
      ((dt[12]) && (dt[13])) || //時の端数と分がある
      ((dt[14]) && (dt[15]))  //分の端数と秒がある
    ) return;

    
    
    //年の補正しながらチェック
    y = num (dt[1] || dt[2] || dt[3]);
    if ((dt[1]) && (y < 10000)) return; //拡張しているのに4桁になっている
    if (dt[4]) y += 2000; //年が2文字なら2000年を加算

    date = new Date (y, 0, 1); // Dateオブジェクト作成
    leap_year = !(y % 4) ^ !(y % 100) ^ !(y % 400); //閏年
    

    //カレンダー形式でチェック
    if ((m = num (dt[5]))) { // 0も判定
      if (12 < m) return; //月が、範囲外

      date.setMonth (--m); //月の設定
      
      if (d = num (dt[5])) { // 0も判定
        max = day_list[m] + (1 === m) * leap_year;
        if (max < d) return; //日が、範囲外
      }
    }

    //週形式でチェック
    else if ('W' === dt[8]) {
      start_week = date.getDay (); //元日の曜日

      if ((w = num (dt[9])) && (53 < w)) return; //週が、範囲外。 0も判定
      d = num (dt[10]) || 1; // 範囲チェックは正規表現

      offset = (start_week <= 4 ? -start_week: 7 - start_week);
      d = w * 7 + d + offset - 7;
      if (365 + leap_year + offset < d) return; //日が、範囲外
    }

    //日数形式でチェック
    else {
      if ((d = num (dt[7])) && (365 + leap_year < d--)) return; //日が、範囲外。 0も判定
    }
    
    if (d)
      date.setDate (d)

    //時のチェック
    hh = num ((dt[11]) + '.' + num (dt[12]));
    if (24 < hh) return; //時が、範囲外 終日24時を含める

    //分のチェック
    mm = num ((dt[13]) + '.' + num (dt[14]));
    if (60 <= mm) return; //時が、範囲外

    //秒のチェック
    ss = num ((dt[15]) + '.' + num (dt[16]));
    if (60 < ss) return; //時が、範囲外 閏秒がありえる
    
    offset = (dt[12] || dt[15])
      ? - date.getTimezoneOffset () + (num (dt[13]) * 60 + num (dt[14])) * -(dt[12] === '-')
      : 0;
    
    ms = ((hh * 60 + mm ) * 60 + ss) * 1000;

    if (ms)
      date.setMilliseconds (ms + offset * 1000);


    return dt;
//    return date;
    
  };

  this.Date_parseISO8601String = parse;
})();


[
  '10',
  '100',
  '1000',
  '+001000',
  '+010000',
  '100002',
  '10000203',
  '1000-034',
  '2000-01-12',
  '2001W011T09',
  '+100000W40T09',
  '+100000W403T09',
  '+123456-01-23T12:34:56.789+01:23',
  '+1234560123T123456.789+0123',
  '-1234560123T123456.789+0123',
  '-123456T123456.789+0123',
  '2010-11-14T12:34:56.789+01:23Z',
  '2010-11-14T12:34:56.789+01:23Z',
  '2010-11-14T12:34:56.789',
  '2010-11-14T12:34.5',
  '2010-11-14T12.5',
  'T12:34:56,100',
  '2010-11-14T09:00:00.000-09:00',
  '19850412T232050Z',
  '19850412T122345.678+12:34',
  'T10',
  '+123456-01-23T00.11:22.33:44.555'
].map (function (t) {
  var ary, d;

//  if (d= Date_parseISO8601String (t)) ary=[t,d.getFullYear(),d.getMonth()+1,d.getDate(),d.getHours(),d.getMinutes(),d.getSeconds(),d.getMilliseconds()];else ary = [t];
  ary = Date_parseISO8601String (t) || [t];
  ary[0]=t;
  document.write ('<tr><td>' + ary.join ('<td>'));
});

</script>
</table>