Bug-把客户端时间当做服务器时间来使用!
2009-05-24 08:45
288 查看
你是否也在犯这样的错误呢?--将客户端时间作为了服务器时间!
这是我第二次在较为正式的网站上遇到这样的Bug,而两次都是由于自己无意间的操作。
一次是在联通的网站上,一次是在一个学校的校园网主页上,两个网站均采用了客户端时间进行各种操作。说实话,至今为止,还没有出现过因为时间的选取问题造成某些严重的后果。但是,真的会很奇怪!
以联通网站为例,会突然间出现,已经历的月份的帐单无法查询或者还未来临的月份帐单可以选择,但是真正查询时却直接报错!既浪费了资源,还给客户一个较差的印象。直接让人家看到了报错页面。至少拦截一下呀。
而那个校园网的主页,作了一个倒计时器,今天我突然间发现倒计时由17天变成了136天?后来才想起来
,早上因为要试一个软件试用期的问题,更改了系统时间。
希望我们以后在做网站开发时,不会犯这样子的低级错误。下面,给出了获取服务器时间与客户端时间的方法,并将二者时间作了对比。可以参考一下。呵呵~
服务器时间,采用http://www.bjtime.com/网站服务器的时间,下面是该网站的声明:
2009-03-24 本站正式开通时间服务器,本时间服务器与国家授时中心时间服务器保持同步,可以使用www.bjtime.com做为你的Internet时间服务器。
2009-03-24 本站增加时间校对功能,请访问此链接检查你的本地时间与标准时间相差多少?如相差很大则需要通过Internet时间服务器同步为标准时间。
2009-03-30 本站开通WAP北京时间,用手机访问:wap.bjtime.com或3g.bjtime.com。手机时间不准,或者手机不带农历查询,您可以随时随地可以用手机上北京时间网校准时间,或查询农历。
代码如下:
<%@page contentType="text/html;charset=gbk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>JavaScript获取服务器与客户端时间[走动]</title>
<script language="javascript" type="text/javascript">
//因程序执行耗费时间,所以时间并不十分准确,误差大约在2000毫秒以下
var xmlHttp = false;
//获取服务器时间
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp = false;
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
xmlHttp.open("GET", "http://www.bjtime.com", false);
xmlHttp.setRequestHeader("Range", "bytes=-1");
xmlHttp.send(null);
severtime=new Date(xmlHttp.getResponseHeader("Date"));
//获取服务器日期
var year=severtime.getFullYear();
var month=severtime.getMonth()+1;
var date=severtime.getDate();
//获取服务器时间
var hour=severtime.getHours();
var minu=severtime.getMinutes();
var seco=severtime.getSeconds();
//获取客户端时间
localtime=new Date();
//取得时间差
var jtime=Math.abs(localtime.getTime()-severtime.getTime());
var jdate=jtime/(24*60*60*1000);
var jhour=jtime%(24*60*60*1000)/(60*60*1000);
var jminu=jtime%(24*60*60*1000)%(60*60*1000)/(60*1000);
var jsecond=jtime%(24*60*60*1000)%(60*60*1000)%(60*1000)/1000;
//格式化输出客户端时间
function getClientTime(){
localtime=new Date();
var cyear=localtime.getFullYear();
var cmonth=localtime.getMonth()+1;
var cdate=localtime.getDate();
var chour=localtime.getHours();
var cminu=localtime.getMinutes();
var cseco=localtime.getSeconds();
ccyear=addZero(cyear);
ccmonth=addZero(cmonth);
ccdate=addZero(cdate);
cchour=addZero(chour);
ccminu=addZero(cminu);
ccseco=addZero(cseco);
cinnerdata="当前客户端时间:";
document.getElementById("clienttime").innerHTML=cinnerdata+ccyear+"-"+ccmonth+"-"+ccdate+" "+cchour+":"+ccminu+":"+ccseco;
document.getElementById('xctime').innerHTML="时间相差:"+Math.round(jdate)+"天"+Math.round(jhour)+"小时"+Math.round(jminu)+"分钟"+jsecond+"秒 总计:"+jtime+"毫秒";
}
//格式化输出服务器时间
function getSeverTime(){
seco++;
if(seco==60){
minu+=1;
seco=0;
}
if(minu==60){
hour+=1;
minu=0;
}
if(hour==24){
date+=1;
hour=0;
}
//日期处理
if(month==1||month==3||month==5||month==7
||month==8||month==10||month==12)
{
if(date==32)
{
date=1;
month+=1;
}
}else if(month==4||month==6||month==9||month==11){
if(date==31){
date=1;
month+=1;
}
}else if(month==2){
if(year%4==0&&year%100!=0){//闰年处理
if(date==29){
date=1;
month+=1;
}
}else{
if(date==28){
date=1;
month+=1;
}
}
}
if(month==13){
year+=1;
month=1;
}
sseco=addZero(seco);
sminu=addZero(minu);
shour=addZero(hour);
sdate=addZero(date);
smonth=addZero(month);
syear=year;
innerdata="当前服务器时间:";
document.getElementById("servertime").innerHTML=innerdata+syear+"-"+smonth+"-"+sdate+" "+shour+":"+sminu+":"+sseco;
setTimeout("getSeverTime()",1000);
setTimeout("getClientTime()",100);
}
function addZero(num) {
num=Math.floor(num);
return ((num <= 9) ? ("0" + num) : num);
}
</script>
</head>
<body onload="getSeverTime();">
<p id="servertime"></p>
<p id="clienttime"></p>
<p id="xctime"></p>
</body>
</html>
这是我第二次在较为正式的网站上遇到这样的Bug,而两次都是由于自己无意间的操作。
一次是在联通的网站上,一次是在一个学校的校园网主页上,两个网站均采用了客户端时间进行各种操作。说实话,至今为止,还没有出现过因为时间的选取问题造成某些严重的后果。但是,真的会很奇怪!
以联通网站为例,会突然间出现,已经历的月份的帐单无法查询或者还未来临的月份帐单可以选择,但是真正查询时却直接报错!既浪费了资源,还给客户一个较差的印象。直接让人家看到了报错页面。至少拦截一下呀。
而那个校园网的主页,作了一个倒计时器,今天我突然间发现倒计时由17天变成了136天?后来才想起来
,早上因为要试一个软件试用期的问题,更改了系统时间。
希望我们以后在做网站开发时,不会犯这样子的低级错误。下面,给出了获取服务器时间与客户端时间的方法,并将二者时间作了对比。可以参考一下。呵呵~
服务器时间,采用http://www.bjtime.com/网站服务器的时间,下面是该网站的声明:
2009-03-24 本站正式开通时间服务器,本时间服务器与国家授时中心时间服务器保持同步,可以使用www.bjtime.com做为你的Internet时间服务器。
2009-03-24 本站增加时间校对功能,请访问此链接检查你的本地时间与标准时间相差多少?如相差很大则需要通过Internet时间服务器同步为标准时间。
2009-03-30 本站开通WAP北京时间,用手机访问:wap.bjtime.com或3g.bjtime.com。手机时间不准,或者手机不带农历查询,您可以随时随地可以用手机上北京时间网校准时间,或查询农历。
代码如下:
<%@page contentType="text/html;charset=gbk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>JavaScript获取服务器与客户端时间[走动]</title>
<script language="javascript" type="text/javascript">
//因程序执行耗费时间,所以时间并不十分准确,误差大约在2000毫秒以下
var xmlHttp = false;
//获取服务器时间
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp = false;
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
xmlHttp.open("GET", "http://www.bjtime.com", false);
xmlHttp.setRequestHeader("Range", "bytes=-1");
xmlHttp.send(null);
severtime=new Date(xmlHttp.getResponseHeader("Date"));
//获取服务器日期
var year=severtime.getFullYear();
var month=severtime.getMonth()+1;
var date=severtime.getDate();
//获取服务器时间
var hour=severtime.getHours();
var minu=severtime.getMinutes();
var seco=severtime.getSeconds();
//获取客户端时间
localtime=new Date();
//取得时间差
var jtime=Math.abs(localtime.getTime()-severtime.getTime());
var jdate=jtime/(24*60*60*1000);
var jhour=jtime%(24*60*60*1000)/(60*60*1000);
var jminu=jtime%(24*60*60*1000)%(60*60*1000)/(60*1000);
var jsecond=jtime%(24*60*60*1000)%(60*60*1000)%(60*1000)/1000;
//格式化输出客户端时间
function getClientTime(){
localtime=new Date();
var cyear=localtime.getFullYear();
var cmonth=localtime.getMonth()+1;
var cdate=localtime.getDate();
var chour=localtime.getHours();
var cminu=localtime.getMinutes();
var cseco=localtime.getSeconds();
ccyear=addZero(cyear);
ccmonth=addZero(cmonth);
ccdate=addZero(cdate);
cchour=addZero(chour);
ccminu=addZero(cminu);
ccseco=addZero(cseco);
cinnerdata="当前客户端时间:";
document.getElementById("clienttime").innerHTML=cinnerdata+ccyear+"-"+ccmonth+"-"+ccdate+" "+cchour+":"+ccminu+":"+ccseco;
document.getElementById('xctime').innerHTML="时间相差:"+Math.round(jdate)+"天"+Math.round(jhour)+"小时"+Math.round(jminu)+"分钟"+jsecond+"秒 总计:"+jtime+"毫秒";
}
//格式化输出服务器时间
function getSeverTime(){
seco++;
if(seco==60){
minu+=1;
seco=0;
}
if(minu==60){
hour+=1;
minu=0;
}
if(hour==24){
date+=1;
hour=0;
}
//日期处理
if(month==1||month==3||month==5||month==7
||month==8||month==10||month==12)
{
if(date==32)
{
date=1;
month+=1;
}
}else if(month==4||month==6||month==9||month==11){
if(date==31){
date=1;
month+=1;
}
}else if(month==2){
if(year%4==0&&year%100!=0){//闰年处理
if(date==29){
date=1;
month+=1;
}
}else{
if(date==28){
date=1;
month+=1;
}
}
}
if(month==13){
year+=1;
month=1;
}
sseco=addZero(seco);
sminu=addZero(minu);
shour=addZero(hour);
sdate=addZero(date);
smonth=addZero(month);
syear=year;
innerdata="当前服务器时间:";
document.getElementById("servertime").innerHTML=innerdata+syear+"-"+smonth+"-"+sdate+" "+shour+":"+sminu+":"+sseco;
setTimeout("getSeverTime()",1000);
setTimeout("getClientTime()",100);
}
function addZero(num) {
num=Math.floor(num);
return ((num <= 9) ? ("0" + num) : num);
}
</script>
</head>
<body onload="getSeverTime();">
<p id="servertime"></p>
<p id="clienttime"></p>
<p id="xctime"></p>
</body>
</html>
相关文章推荐
- 在.NET Core使用TimeZone将客户端时间转服务器本地时间但编译提示已过期
- 获取.net页面的服务器和客户端2种执行时间
- Android 使用Socket实现服务器与手机客户端的长连接三:clientA 发送给clientB,定点发送
- 使用nginx做前端服务器可以设置类似的静态文件客户端缓存
- RakNet 服务器设置密码 & 客户端使用密码 访问
- Mac OS搭建Tomcat服务器, 与客户端使用JSON格式和Servlet进行HTTP通信
- 使用Spring构建RMI服务器和客户端
- Redis服务器搭建/配置/及Jedis客户端的使用方法
- SVN服务器与客户端下载地址_搭建使用
- 使用YII构建移动客户端的服务器:不只是输出Json那么简单
- 确定流媒体服务器中每客户端带宽使用量
- 在Linux上(我的服务器是Ubuntu) 用redis-trib.rb搭建redis集群,并在客户端使用spring-data-redis连接(亲测)
- java使用UDP协议进行服务器客户端通信
- 使用C#作为客户端的PHP服务器上传文件
- 客户端时间如何与服务器时间同步(多层架构系统理应如此)
- ubuntu中svn简明用法:服务器搭建+客户端使用
- tcp通讯的方式并使用socket建立客户端与服务器的通信的过程
- 【转】linux中使用命名管道实现客户端/服务器模型的进程间通信
- 使用socket的Linux上的C语言文件传输顺序服务器和客户端示例程序
- 跨服务器/客户端的备份命令:rsync的使用