created and maintained by tokd

HTMLApplication

HTA版世界時計


菊池さんのJavaScript版サマータイム対応
世界時計を参考に作成。tclock の左クリックに割り当てて使ってる。
海外との電話会議やテレビ会議のスケジュール確認に便利なように、
予定日時を指定できるようにした。

エディタ等を使って下記スクリプトに拡張子 .hta をつけて保存し、
同じディレクトリに以下のファイルを置く。
- http://www.adachi-shihoshoshi.com/update/jkl-calendar_sp1.1.js
- http://www.h3.dion.ne.jp/~sakatsu/HolidayChk.js

ウィンドウサイズや対象都市・タイムゾーンの変更は、
適宜スクリプトを修正すること。なお、動作確認は IE6/8 のみ。

スクリーンショット


<!-- Written by tokd for World Time Clock HTA 2009/5/22 -->
<html>
<head>
<title>World Time Clock</title>
<script type="text/javascript" src="jkl-calendar_sp1.1.js" charset="Shift_JIS"></script>
<script type="text/javascript" src="HolidayChk.js" charset="Shift_JIS"></script>
<script>
var x = 410; var y = 220;
while (true) {
	try {
		resizeTo(x, y);
		moveTo((screen.width-x) / 2, (screen.height-y) / 2);
		break;
	} catch (e) {}
}

var cal1 = new JKL.Calendar("calid", "formid", "colname");

function adjust(select)
{
	var cal_d = new Date();
	if (select) {
		cal_d.setTime(Date.parse(document.getElementById("colname").value) +
			      document.getElementById("p_hour").selectedIndex * 3600000);
	}
	var year = cal_d.getYear();    if (year < 2000) { year += 2000; }
	var mon  = cal_d.getMonth()+1; if (mon  < 10) { mon  = "0" + mon; }
	var date = cal_d.getDate();    if (date < 10) { date = "0" + date; }
	document.getElementById("colname").value = year + "/" + mon + "/" + date;
	document.getElementById("p_hour").selectedIndex = cal_d.getHours();
}

function main()
{
//=========================================================================
// 世界時計(全世界夏時間対応、DST:Daylight Saving Time)2007年版 v1.3
// Copyright (c) 2003.12 「菊池さん」<http://kikuchisan.net/>
// Modified by tokd
//=========================================================================
// メインプログラム
//=========================================================================
	now      = new Date();
	var year = now.getYear(); if (year < 2000) { year += 1900; }
	offset   = now.getTimezoneOffset() / 60; //GMTからの時差(単位:時)

	var cal_d = new Date();
	cal_d.setTime(Date.parse(document.getElementById("colname").value) +
		      document.getElementById("p_hour").selectedIndex * 3600000);
	var now_d = new Date(year, now.getMonth(), now.getDate(), now.getHours());
	offset += (cal_d - now_d) / 3600000;

	//夏時間の開始終了日計算
	sun3_2 = calcDst(year, 3, 2, 0);// 3月第2 日曜日(米国型開始,チリ型終了)
	sun11_1= calcDst(year,11, 1, 0);//11月第1 日曜日(米国型終了)
	sun4_1 = calcDst(year, 4, 1, 0);// 4月第1 日曜日(中米型開始,ナミビア型終了)
	sun3_e = calcDst(year, 3, 5, 0);// 3月最終日曜日(欧州型開始,NIS型開始,オーストラリア型終了,タスマニア型終了)
	sun10_e= calcDst(year,10, 5, 0);//10月最終日曜日(欧州型終了,NIS型終了,オーストラリア型開始,中米型終了)
	y_11_2 = calcDst(year,11, 2,-1);//10月第3 日曜日(ブラジル型開始)
	sun2_3 = calcDst(year, 2, 3, 0);// 2月第3 日曜日(ブラジル型終了)
	thu4_e = calcDst(year, 4, 5, 4);// 4月最終木曜日(エジプト型開始)
	thu9_e = calcDst(year, 9, 5, 4);// 9月最終木曜日(エジプト型終了)
	y_4_1  = calcDst(year, 4, 1,-1);//日付指定(イラク型開始)
	y_10_1 = calcDst(year,10, 1,-1);//日付指定(イラク型終了)
	sun10_1= calcDst(year,10, 1, 0);//10月第1 日曜日(タスマニア型開始,ニュージーランド型開始)
	sun3_3 = calcDst(year, 3, 3, 0);// 3月第3 日曜日(ニュージーランド型終了)
	sun10_2= calcDst(year,10, 2, 0);//10月第2 日曜日(チリ型開始)
	y_3_27 = calcDst(year, 3,27,-1);//日付指定(モンゴル型開始)
	y_10_30= calcDst(year,10,24,-1);//日付指定(モンゴル型終了)
	y_4_15 = calcDst(year, 4,15,-1);//日付指定(パレスチナ型開始)
	y_10_14= calcDst(year,10,15,-1);//日付指定(パレスチナ型終了)
	y_3_20 = calcDst(year, 3,20,-1);//日付指定(イラン型開始)
	y_9_20 = calcDst(year, 9,20,-1);//日付指定(イラン型終了)
	y_4_6  = calcDst(year, 4, 6,-1);//日付指定(イスラエル型開始)
	y_9_21 = calcDst(year, 9,21,-1);//日付指定(イスラエル型終了)
	y_3_24 = calcDst(year, 3,24,-1);//日付指定(ヨルダン型開始)
	y_10_21= calcDst(year,10,15,-1);//日付指定(ヨルダン型終了)
	y_3_31 = calcDst(year, 3,31,-1);//日付指定(シリア型開始)
	y_9_30 = calcDst(year, 9,30,-1);//日付指定(シリア型終了)
	sun9_1 = calcDst(year, 9, 1, 0);// 9月第1 日曜日(ナミビア型開始,フォークランド型開始)
	sun4_3 = calcDst(year, 4, 3, 0);// 4月第3 日曜日(フォークランド型終了)
	y_10_17= calcDst(year,10,17,-1);//日付指定(パラグァイ型開始)
	y_4_4  = calcDst(year, 4, 4,-1);//日付指定(パラグァイ型終了)

	//時刻表示
	var pctime = now.getTime(); //PC時刻(内部表現)
	var msg = "";

	msg += "PST " + calcTime(pctime, -8, 1) + "\n";
	msg += "CET " + calcTime(pctime,  1, 2) + "\n";
	msg += "JST " + calcTime(pctime,  9, 0) + "\n";
	msg += "\n";
	msg += "Hour offset from now: " + (offset - now.getTimezoneOffset() / 60);

	document.getElementById("CONSOLE").innerText = msg;
	window.setTimeout("main()", 1000);
}
//=========================================================================
// サブルーチン
//=========================================================================
// その都市の夏時間対応ローカル時刻計算
// 引数  .... PC時刻(内部表現、単位:ミリ秒) pctime
//     .... 時刻を求める都市のタイムゾーン(単位:時) tzone
//     .... 夏時間処理フラグ:無(0),米国型(1),欧州型(2),NIS型(3)等 flag
// 戻り値 .... 夏時間対応ローカル時刻(日時表現)
//=========================================================================
function calcTime(pctime, tzone, flag) {
	//ローカル時刻の計算
	var twntime = pctime + (tzone + offset) * 3600000; //単位ミリ秒
	//夏時間の処理
	var mark = ""; //DSTマーク表示用
	if (((flag ==  1) && ((sun3_2 + 3600000 <= twntime) && (sun11_1 > twntime))) || //米国型
		((flag ==  2) && ((sun3_e  <= twntime) && (sun10_e > twntime))) || //欧州型
		((flag ==  3) && ((sun3_e  <= twntime) && (sun10_e > twntime))) || //NIS型
		((flag ==  4) && ((sun10_e <= twntime) || (sun3_e  > twntime))) || //オーストラリア型
		((flag ==  5) && ((y_11_2  <= twntime) || (sun2_3  > twntime))) || //ブラジル型
		((flag ==  6) && ((thu4_e  <= twntime) && (thu9_e  > twntime))) || //エジプト型
		((flag ==  7) && ((y_4_1   <= twntime) && (y_10_1  > twntime))) || //イラク型
		((flag ==  8) && ((sun10_1 <= twntime) || (sun3_3  > twntime))) || //ニュージーランド型
		((flag ==  9) && ((sun10_2 <= twntime) || (sun3_2  > twntime))) || //チリ型
		((flag == 10) && ((y_3_27  <= twntime) && (y_10_30 > twntime))) || //モンゴル型
		((flag == 11) && ((y_4_15  <= twntime) && (y_10_14 > twntime))) || //パレスチナ型
		((flag == 12) && ((y_3_20  <= twntime) && (y_9_20  > twntime))) || //イラン型
		((flag == 13) && ((thu3_e  <= twntime) && (thu10_1 > twntime))) || //イスラエル型
		((flag == 14) && ((y_3_24  <= twntime) && (y_10_21 > twntime))) || //ヨルダン型
		((flag == 15) && ((y_3_31  <= twntime) && (y_9_30  > twntime))) || //シリア型
		((flag == 16) && ((sun9_1  <= twntime) || (sun4_1  > twntime))) || //ナミビア型
		((flag == 17) && ((sun9_1  <= twntime) || (sun4_3  > twntime))) || //フォークランド型
		((flag == 18) && ((sun10_1 <= twntime) || (sun3_e  > twntime))) || //タスマニア型
		((flag == 19) && ((y_10_17 <= twntime) || (y_4_4   > twntime))) || //パラグァイ型
		((flag == 20) && ((sun4_1  <= twntime) && (sun10_e > twntime))))   //中米型
		{ twntime += 3600000; mark = " DST"; }
	//夏時間対応ローカル時刻を内部表現から日時表現に変換し戻り値にセット
	now.setTime(twntime);
	var mon  = now.getMonth()+1; if (mon  < 10) { mon  = "0" + mon; }
	var date = now.getDate();    if (date < 10) { date = "0" + date; }
	var day  = new Array( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" );
	var hour = now.getHours();   if (hour < 10) { hour = "0" + hour; }
	var min  = now.getMinutes(); if (min  < 10) { min  = "0" + min; }
	var sec  = now.getSeconds(); if (sec  < 10) { sec  = "0" + sec; }
	return now.getYear() + "/" + mon + "/" + date + " " + day[now.getDay()] + " " +
			hour + ":" + min + ":" + sec + mark;
}
//=========================================================================
// 第何曜日は何日かの算出
// 引数  .... 計算対象となる年月 year month(1~12)
//     .... wno=0~6の時:第何曜日の指定(最終曜日は5を指定) num(1~5)
//     ....  or wno=-1の時:何日の指定 num(1~31)
//     .... 曜日の指定(日=0,月=1,火=2,・・・土=6) wno(0~6)
//     ....  or 何日の指定(=-1) wno(-1)
// 戻り値 .... 時刻(内部表現)
//=========================================================================
function calcDst(year, month, num, wno) {
	//パラメータ判定
	if (month < 1 || month > 12) { alert("月指定エラーです"); return; }
	if (wno < 0) { //日時指定の場合
		if (num < 1 || num > 31) { alert("日時指定エラーです"); return; }
		//指定年月日の午前1時の時刻を求め内部表現に変換し戻り値にセット
		var dstime = new Date(year, month-1, num, 1, 0, 0);
		return dstime.getTime();
	} else { //第何曜日指定(最終曜日は5)の場合
		if (num < 1 || num > 5) { alert("第何週指定エラーです"); return; }
		if (wno > 6) { alert("曜日指定エラーです"); return; }

		//ツェラーの公式よりその年月の1日の曜日を計算
		if (month <= 2)
			{ var zyear = year - 1; var zmonth = month + 12; }
		else
			{ var zyear = year;     var zmonth = month; }  //1月,2月は前年の13月,14月とする
		var wday = (zyear + Math.floor(zyear/4) - Math.floor(zyear/100)
					+ Math.floor(zyear/400) + Math.floor((13*zmonth + 8)/5) + 1) % 7;

		//最終曜日指定の場合第5曜日有無の判定
		if (num == 5) {
			if (month == 2) {
				if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
					{ var leap = 1; }
				else
					{ var leap = 0; } //閏年判定
				if (leap == 0 || wno != wday)
					{ num -= 1; } //閏年は29日のみ第5曜日
			} else if (month== 4 || month== 6 || month== 9 || month== 11) { //30日月
				if (wno <= 1)
					{ if ((wno+1) <= wday && wday < (wno+6)) { num -= 1; }}
				else
					{ if ((wno+1) <= wday || wday < (wno-1)) { num -= 1; }}
			} else { //31日月
				if (wno <= 2)
					{ if ((wno+1) <= wday && wday < (wno+5)) { num -= 1; }}
				else
					{ if ((wno+1) <= wday || wday < (wno-2)) { num -= 1; }}
			}
		}
		//第(num)wno曜日は何日かの計算
		if (wday <= wno)
			{ var dstime = (num-1) * 7 + ((wno+1) - wday); }
		else
			{ var dstime = num * 7 - (wday - (wno+1)); }

		//算出した年月日の午前1時の時刻を求め内部表現に変換し戻り値にセット
		dstime = new Date(year, month-1, dstime, 1, 0, 0);
		return dstime.getTime();
	}
}
</script>
<hta:application
	applicationName="World Time Clock"
	maximizeButton="no"
	minimizeButton="no"
	scroll="no"
	singleInstance="yes"
</hta:application>
</head>
<body onload="cal1.write(1); adjust(0); main();">
<table><tr>
	<td valign="top">
		<div id="calid"></div>
	</td>
	<td>
		<pre id="CONSOLE"></pre>
		<form id="formid" action="">
		Scheduled date:
		<input type="text" name="colname" size="13" readonly>
		Scheduled hour:
		<select name="p_hour" size=1 onchange="adjust(1);">
		<option> 0<option> 1<option> 2<option> 3<option> 4<option> 5<option> 6<option> 7
		<option> 8<option> 9<option>10<option>11<option>12<option>13<option>14<option>15
		<option>16<option>17<option>18<option>19<option>20<option>21<option>22<option>23
		</select>
		<input type="button" value="Now" onclick="adjust(0);">
		</form>
	</td>
</tr></table>
</body>
</html>

(おまけ)世界時計 for TClock Tooltip


上記 HTA の前身。Microsoft Time Zone を置き換えるために作成。
エディタ等を使って下記スクリプトに拡張子 .js をつけて保存する。

スクリプトが実行された時の時差情報を同じディレクトリの
WorldTimeClock.txt というファイルに出力するので、
このスクリプトを TClock の左クリックに割り当てて
WorldTimeClock.txt をツールチップに指定すれば、簡易世界時計となる。


//=========================================================================
// 世界時計(全世界夏時間対応、DST:Daylight Saving Time)2007年版 v1.3
// Copyright (c) 2003.12 「菊池さん」<http://kikuchisan.net/>
// Modified by tokd for world time tclock javascript 2009/5/22
//=========================================================================
// メインプログラム
//=========================================================================
now      = new Date();
var year = now.getYear(); if (year < 2000) { year += 1900; }
offset   = now.getTimezoneOffset() / 60; //GMTからの時差(単位:時)

//夏時間の開始終了日計算
sun3_2 = calcDst(year, 3, 2, 0);// 3月第2 日曜日(米国型開始,チリ型終了)
sun11_1= calcDst(year,11, 1, 0);//11月第1 日曜日(米国型終了)
sun4_1 = calcDst(year, 4, 1, 0);// 4月第1 日曜日(中米型開始,ナミビア型終了)
sun3_e = calcDst(year, 3, 5, 0);// 3月最終日曜日(欧州型開始,NIS型開始,オーストラリア型終了,タスマニア型終了)
sun10_e= calcDst(year,10, 5, 0);//10月最終日曜日(欧州型終了,NIS型終了,オーストラリア型開始,中米型終了)
y_11_2 = calcDst(year,11, 2,-1);//10月第3 日曜日(ブラジル型開始)
sun2_3 = calcDst(year, 2, 3, 0);// 2月第3 日曜日(ブラジル型終了)
thu4_e = calcDst(year, 4, 5, 4);// 4月最終木曜日(エジプト型開始)
thu9_e = calcDst(year, 9, 5, 4);// 9月最終木曜日(エジプト型終了)
y_4_1  = calcDst(year, 4, 1,-1);//日付指定(イラク型開始)
y_10_1 = calcDst(year,10, 1,-1);//日付指定(イラク型終了)
sun10_1= calcDst(year,10, 1, 0);//10月第1 日曜日(タスマニア型開始,ニュージーランド型開始)
sun3_3 = calcDst(year, 3, 3, 0);// 3月第3 日曜日(ニュージーランド型終了)
sun10_2= calcDst(year,10, 2, 0);//10月第2 日曜日(チリ型開始)
y_3_27 = calcDst(year, 3,27,-1);//日付指定(モンゴル型開始)
y_10_30= calcDst(year,10,24,-1);//日付指定(モンゴル型終了)
y_4_15 = calcDst(year, 4,15,-1);//日付指定(パレスチナ型開始)
y_10_14= calcDst(year,10,15,-1);//日付指定(パレスチナ型終了)
y_3_20 = calcDst(year, 3,20,-1);//日付指定(イラン型開始)
y_9_20 = calcDst(year, 9,20,-1);//日付指定(イラン型終了)
y_4_6  = calcDst(year, 4, 6,-1);//日付指定(イスラエル型開始)
y_9_21 = calcDst(year, 9,21,-1);//日付指定(イスラエル型終了)
y_3_24 = calcDst(year, 3,24,-1);//日付指定(ヨルダン型開始)
y_10_21= calcDst(year,10,15,-1);//日付指定(ヨルダン型終了)
y_3_31 = calcDst(year, 3,31,-1);//日付指定(シリア型開始)
y_9_30 = calcDst(year, 9,30,-1);//日付指定(シリア型終了)
sun9_1 = calcDst(year, 9, 1, 0);// 9月第1 日曜日(ナミビア型開始,フォークランド型開始)
sun4_3 = calcDst(year, 4, 3, 0);// 4月第3 日曜日(フォークランド型終了)
y_10_17= calcDst(year,10,17,-1);//日付指定(パラグァイ型開始)
y_4_4  = calcDst(year, 4, 4,-1);//日付指定(パラグァイ型終了)

//時刻表示
var pctime = now.getTime(); //PC時刻(内部表現)
var msg = "";

//msg += "ウェリントン     " + calcTime(pctime, 12, 8) + "\n";
//msg += "シドニー         " + calcTime(pctime, 10, 4) + "\n";
//msg += "東京             " + calcTime(pctime,  9, 0) + "\n";
//msg += "ウランバートル   " + calcTime(pctime,  8, 0) + "\n";
//msg += "北京・香港       " + calcTime(pctime,  8, 0) + "\n";
//msg += "バクダット       " + calcTime(pctime,  3, 7) + "\n";
//msg += "モスクワ         " + calcTime(pctime,  3, 2) + "\n";
//msg += "カイロ           " + calcTime(pctime,  2, 6) + "\n";
//msg += "ロンドン         " + calcTime(pctime,  0, 2) + "\n";
//msg += "リオデジャネイロ " + calcTime(pctime, -3, 5) + "\n";
//msg += "サンティアゴ     " + calcTime(pctime, -4, 9) + "\n";
//msg += "ニューヨーク     " + calcTime(pctime, -5, 1) + "\n";
//msg += "ロサンジェルス   " + calcTime(pctime, -8, 1) + "\n";
//msg += "ホノルル         " + calcTime(pctime,-10, 0) + "\n";
//msg += "テヘラン         " + calcTime(pctime,3.5,12) + "\n";

msg += "PST " + calcTime(pctime, -8, 1) + "\n";
msg += "CET " + calcTime(pctime,  1, 2) + "\n";
msg += "JST " + calcTime(pctime,  9, 0);

// WSH jscript for Tclock tooltip
var fso = new ActiveXObject("Scripting.FileSystemObject");
var outFile = fso.CreateTextFile("WorldTimeClock.txt", true);
outFile.Write(msg);
outFile.Close();

//=========================================================================
// サブルーチン
//=========================================================================
// その都市の夏時間対応ローカル時刻計算
// 引数  .... PC時刻(内部表現、単位:ミリ秒) pctime
//     .... 時刻を求める都市のタイムゾーン(単位:時) tzone
//     .... 夏時間処理フラグ:無(0),米国型(1),欧州型(2),NIS型(3)等 flag
// 戻り値 .... 夏時間対応ローカル時刻(日時表現)
//=========================================================================
function calcTime(pctime, tzone, flag) {
	//ローカル時刻の計算
	var twntime = pctime + (tzone + offset) * 3600000; //単位ミリ秒
	//夏時間の処理
	var mark = ""; //DSTマーク表示用
	if (((flag ==  1) && ((sun3_2 + 3600000 <= twntime) && (sun11_1 > twntime))) || //米国型
		((flag ==  2) && ((sun3_e  <= twntime) && (sun10_e > twntime))) || //欧州型
		((flag ==  3) && ((sun3_e  <= twntime) && (sun10_e > twntime))) || //NIS型
		((flag ==  4) && ((sun10_e <= twntime) || (sun3_e  > twntime))) || //オーストラリア型
		((flag ==  5) && ((y_11_2  <= twntime) || (sun2_3  > twntime))) || //ブラジル型
		((flag ==  6) && ((thu4_e  <= twntime) && (thu9_e  > twntime))) || //エジプト型
		((flag ==  7) && ((y_4_1   <= twntime) && (y_10_1  > twntime))) || //イラク型
		((flag ==  8) && ((sun10_1 <= twntime) || (sun3_3  > twntime))) || //ニュージーランド型
		((flag ==  9) && ((sun10_2 <= twntime) || (sun3_2  > twntime))) || //チリ型
		((flag == 10) && ((y_3_27  <= twntime) && (y_10_30 > twntime))) || //モンゴル型
		((flag == 11) && ((y_4_15  <= twntime) && (y_10_14 > twntime))) || //パレスチナ型
		((flag == 12) && ((y_3_20  <= twntime) && (y_9_20  > twntime))) || //イラン型
		((flag == 13) && ((thu3_e  <= twntime) && (thu10_1 > twntime))) || //イスラエル型
		((flag == 14) && ((y_3_24  <= twntime) && (y_10_21 > twntime))) || //ヨルダン型
		((flag == 15) && ((y_3_31  <= twntime) && (y_9_30  > twntime))) || //シリア型
		((flag == 16) && ((sun9_1  <= twntime) || (sun4_1  > twntime))) || //ナミビア型
		((flag == 17) && ((sun9_1  <= twntime) || (sun4_3  > twntime))) || //フォークランド型
		((flag == 18) && ((sun10_1 <= twntime) || (sun3_e  > twntime))) || //タスマニア型
		((flag == 19) && ((y_10_17 <= twntime) || (y_4_4   > twntime))) || //パラグァイ型
		((flag == 20) && ((sun4_1  <= twntime) && (sun10_e > twntime))))   //中米型
		{ twntime += 3600000; mark = " DST"; }
	//夏時間対応ローカル時刻を内部表現から日時表現に変換し戻り値にセット
	now.setTime(twntime);
	var mon  = now.getMonth()+1; if (mon  < 10) { mon  = "0" + mon; }
	var date = now.getDate();    if (date < 10) { date = "0" + date; }
	var day  = new Array( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" );
	var hour = now.getHours();   if (hour < 10) { hour = "0" + hour; }
	var min  = now.getMinutes(); if (min  < 10) { min  = "0" + min; }
	var sec  = now.getSeconds(); if (sec  < 10) { sec  = "0" + sec; }
	return now.getYear() + "/" + mon + "/" + date + " " + day[now.getDay()] + " " +
			hour + ":" + min + ":" + mark;
}
//=========================================================================
// 第何曜日は何日かの算出
// 引数  .... 計算対象となる年月 year month(1~12)
//     .... wno=0~6の時:第何曜日の指定(最終曜日は5を指定) num(1~5)
//     ....  or wno=-1の時:何日の指定 num(1~31)
//     .... 曜日の指定(日=0,月=1,火=2,・・・土=6) wno(0~6)
//     ....  or 何日の指定(=-1) wno(-1)
// 戻り値 .... 時刻(内部表現)
//=========================================================================
function calcDst(year, month, num, wno) {
	//パラメータ判定
	if (month < 1 || month > 12) { alert("月指定エラーです"); return; }
	if (wno < 0) { //日時指定の場合
		if (num < 1 || num > 31) { alert("日時指定エラーです"); return; }
		//指定年月日の午前1時の時刻を求め内部表現に変換し戻り値にセット
		var dstime = new Date(year, month-1, num, 1, 0, 0);
		return dstime.getTime();
	} else { //第何曜日指定(最終曜日は5)の場合
		if (num < 1 || num > 5) { alert("第何週指定エラーです"); return; }
		if (wno > 6) { alert("曜日指定エラーです"); return; }

		//ツェラーの公式よりその年月の1日の曜日を計算
		if (month <= 2)
			{ var zyear = year - 1; var zmonth = month + 12; }
		else
			{ var zyear = year;     var zmonth = month; }  //1月,2月は前年の13月,14月とする
		var wday = (zyear + Math.floor(zyear/4) - Math.floor(zyear/100)
					+ Math.floor(zyear/400) + Math.floor((13*zmonth + 8)/5) + 1) % 7;

		//最終曜日指定の場合第5曜日有無の判定
		if (num == 5) {
			if (month == 2) {
				if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
					{ var leap = 1; }
				else
					{ var leap = 0; } //閏年判定
				if (leap == 0 || wno != wday)
					{ num -= 1; } //閏年は29日のみ第5曜日
			} else if (month== 4 || month== 6 || month== 9 || month== 11) { //30日月
				if (wno <= 1)
					{ if ((wno+1) <= wday && wday < (wno+6)) { num -= 1; }}
				else
					{ if ((wno+1) <= wday || wday < (wno-1)) { num -= 1; }}
			} else { //31日月
				if (wno <= 2)
					{ if ((wno+1) <= wday && wday < (wno+5)) { num -= 1; }}
				else
					{ if ((wno+1) <= wday || wday < (wno-2)) { num -= 1; }}
			}
		}
		//第(num)wno曜日は何日かの計算
		if (wday <= wno)
			{ var dstime = (num-1) * 7 + ((wno+1) - wday); }
		else
			{ var dstime = num * 7 - (wday - (wno+1)); }

		//算出した年月日の午前1時の時刻を求め内部表現に変換し戻り値にセット
		dstime = new Date(year, month-1, dstime, 1, 0, 0);
		return dstime.getTime();
	}
}

Tips


navigator.userAgent の部分で十分な記憶域がないというスクリプトエラーが発生した場合は、User-Agent を短くすること。IE ならばレジストリを修正する。