編程(Programming)是編定程序的中文簡(jiǎn)稱(chēng),就是讓計(jì)算機(jī)代碼解決某個(gè)問(wèn)題,對(duì)某個(gè)計(jì)算體系規(guī)定一定的運(yùn)算方式,使計(jì)算體系按照該計(jì)算方式運(yùn)行,并最終得到相應(yīng)結(jié)果的過(guò)程。為了使計(jì)算機(jī)能夠理解(understand)人的意圖,人類(lèi)就必須將需解決的問(wèn)題的思路、方法和手段通過(guò)計(jì)算機(jī)能夠理解的形式告訴計(jì)算機(jī),使得計(jì)算機(jī)能夠根據(jù)人的指令一步一步去工作,完成某種特定的任務(wù)。這種人和計(jì)算體系之間交流的過(guò)程就是編程。 【實(shí)例名稱(chēng)】 JS代碼實(shí)現(xiàn)全球的時(shí)間查看表 【實(shí)例描述】 在賓館的大堂經(jīng)常看到全球各地的一些時(shí)間,這也可用在賓館或航空部門(mén)的網(wǎng)頁(yè)上,用戶(hù)可通過(guò)選擇時(shí)區(qū)來(lái)查看不同地方的時(shí)間。 【實(shí)例代碼】 <html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>標(biāo)題頁(yè)-本站(www.xue51.com)</title>
</head>
<body bgcolor="#cccccc" OnLoad="getTime(timezone, 0)">
<script language="JavaScript">
var timerRunning = false;
var timezone = "格林尼治標(biāo)準(zhǔn)時(shí)間";
var adjust = 0;
function getTime(tzone, diff)
//獲取指定時(shí)區(qū)的時(shí)間
{
if (timerRunning) {
clearTimeout(updatetime);
timerRunning = false;
}
gmtOffset=eval(diff+adjust);
//此處設(shè)置時(shí)區(qū)差別
timezone = tzone;
checkDateTime();
}
function checkDateTime () {
var today = new Date();
//獲取當(dāng)前時(shí)間
var year = today.getYear() + 00;
//獲取年
var month = today.getMonth()+1;
//獲取月
var date = today.getDate();
//獲取日期
var day = today.getDay();
//獲取日
var hour = today.getHours();
//獲取小時(shí)
var minute = today.getMinutes();
//獲取分
var second = today.getSeconds();
//獲取秒 var lastSat = date - (day+1);
while (lastSat < 32) lastSat+=7;
if (lastSat > 31) lastSat+=-7;
var firstSat = date - (day+1);
while (firstSat > 0) firstSat+=-7;
if (firstSat < 1) firstSat+=7;
if ((((month == 4) && (date >= firstSat)) || month > 4) &&
(month < 11 || ((month == 10) && day <= lastSat)))
adjust += 60;
yourOffset = (new Date()).getTimezoneOffset();
//當(dāng)前計(jì)算機(jī)上的時(shí)間和UTC 之間相差的分鐘數(shù)
yourOffset = yourOffset + adjust; if ((((month == 4) && (date > 20)) || month > 4) &&
(month < 11 || ((month == 10) &&
day < 30))) adjust -= 60; ourDifference = eval(gmtOffset - yourOffset);
//根據(jù)本地時(shí)間和前面獲取的與utc之間的差別
var half = eval(ourDifference % 60);
//取60的余,剩下的是分鐘數(shù)
ourDifference = Math.round(ourDifference / 60);
//獲取間隔的小時(shí)數(shù)
hour = eval(hour - ourDifference);
//用本地小時(shí)-間隔的小時(shí)
var m = new Array("",
"1","2","3",
"4","5","6",
"7","8","9",
"10","11","12");
//月份數(shù)組
var leap = eval(year % 4);
//判斷閏年的變量(不太精確) if ((half == -30) || (half == 30)) minute += 30;
if (minute > 59) minute -= 60, hour++;
//當(dāng)超過(guò)60分鐘時(shí),小時(shí)數(shù)增加
if (minute < 0) minute += 60, hour--;
//當(dāng)小于60分鐘時(shí),小時(shí)數(shù)減少
if (hour > 23) hour -= 24, date += 1;
//當(dāng)超過(guò)24小時(shí)時(shí),天數(shù)加1
if (((month == 4) || (month == 6) ||
(month == 9) || (month == 11)) && (date==31)) date = 1, month ++;
//指定的月為30天,超過(guò)30,則月份加1
if (((month == 2) && (date > 28)) && (leap != 0)) date = 1, month ++;
//2月份比較特殊
if ((month == 2) && (date > 29)) date = 1, month++;
//非閏年時(shí)候的2月份
if (hour < 0) hour += 24, date --;
//如果小時(shí)數(shù)小于0,則天數(shù)減1
if ((date == 32) && (month == 12)) month = m[1], date = 1, year++;
//當(dāng)超過(guò)一年時(shí)
if (date == 32) date = 1, month++;
//當(dāng)超過(guò)一月時(shí)
if ((date < 1) && (month == 1)) month= m[12], date = 31, year--;
//當(dāng)前月份為1月份時(shí),如果天數(shù)小于1,則轉(zhuǎn)到12月份
if (date < 1) date = 31, month --;
//日子小于1時(shí),月份減1
if (((month == 4) || (month == 6) ||
//一月30天的設(shè)置
(month== 9) || (month == 11)) && (date == 31)) date = 30;
if ((month == 2) && (date > 28)) date = 29;
//2月份的設(shè)置
if (((month == 2) && (date > 28)) && (leap != 0)) date=28;
for (i=1; i<13; i++) {
if (month == i) {
month = m[i];
break;
}
} var dateTime = hour;
dateTime = ((dateTime < 10) ? "0":"") + dateTime;
//顯示兩位數(shù)的時(shí)間
dateTime = " " + dateTime;
dateTime += ((minute < 10) ? ":0" : ":") + minute;
//顯示兩位數(shù)的分鐘
dateTime += ((second < 10) ? ":0" : ":") + second;
//顯示兩位數(shù)的秒
dateTime += (hour >= 12) ? "下午, " : "上午, ";
//顯示漢字:上午和下午
dateTime += year + "年" + month + "月" + date + "日" ;
//顯示年月日 document.clock.zonetime.value = dateTime;
//顯示所選時(shí)區(qū)的時(shí)間
document.clock.zonename.value = timezone;
//顯示選擇的時(shí)區(qū)
updatetime=setTimeout("checkDateTime()", 1000);
//定時(shí)更新時(shí)間-每隔1秒
timerRunning = true;
}
</script>
<br>
<form name=clock>
<input type=text name=zonetime size=28>
<br>
<br>
<b>當(dāng)前選擇的地區(qū)</b><br>
<input type=text name=zonename size=21>
<br>
<br>
<table border=1 cellpadding=5>
<tr>
<td align=center>
<input type=button value="太平洋"
onClick="getTime(this.value, +480)" name="button">
</td>
<td align=center>
<input type=button value="中心"
onClick="getTime(this.value, +420)" name="button">
</td>
<td align=center>
<input type=button value="東方"
onClick="getTime(this.value, +300)" name="button">
</td>
</tr>
<tr>
<td align=center>
<input type=button value="夏威夷" onClick="
getTime(this.value, +600)" name="button">
</td>
<td align=center>
<input type=button value="墨西哥"
onClick="getTime(this.value, +360)" name="button">
</td>
<td align=center>
<input type=button value="新德里"
onClick="getTime(this.value, -330)" name="button">
</td>
</tr>
<tr>
<td align=center>
<input type=button value="北京"
onClick="getTime(this.value, -420)" name="button">
</td>
<td align=center>
<input type=button value="東京"
onClick="getTime(this.value, -540)" name="button">
</td>
<td align=center>
<input type=button value="倫敦"
onClick="getTime(this.value, +0)" name="button">
</td>
</tr>
</table>
</form>
</body>
</html>
【運(yùn)行效果】
 【難點(diǎn)剖析】 本例的重點(diǎn)有兩個(gè):格林尼治時(shí)間的定義,以及當(dāng)?shù)貢r(shí)間與標(biāo)準(zhǔn)時(shí)間之間的時(shí)間差。全球被劃分為24個(gè)時(shí)區(qū),以通過(guò)英國(guó)格林尼治天文臺(tái)的本初子午線(xiàn)為標(biāo)準(zhǔn),其東西經(jīng)度7.5度的范圍為零時(shí)區(qū),每個(gè)時(shí)區(qū)中央經(jīng)線(xiàn)上的時(shí)間就是各時(shí)區(qū)的標(biāo)準(zhǔn)時(shí)間。“getTimezoneOffset”方法用來(lái)獲取當(dāng)?shù)貢r(shí)間與UTC(標(biāo)準(zhǔn)時(shí)間)之間的時(shí)間差。因?yàn)榇朔椒ǚ祷氐氖欠昼姅?shù),所以可以通過(guò)“/60”的方式獲取小時(shí)數(shù),然后通過(guò)“%60”的方式獲取剩余的分鐘數(shù)。 【源碼下載】 為了JS代碼的準(zhǔn)確性,請(qǐng)點(diǎn)擊:全球的時(shí)間查看表 進(jìn)行本實(shí)例源碼下載
使用編程語(yǔ)言寫(xiě)的程序,由于每條指令都對(duì)應(yīng)計(jì)算機(jī)一個(gè)特定的基本動(dòng)作,所以程序占用內(nèi)存少、執(zhí)行效率高。 |