ありがとうポイントを獲得!!
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>