用户是变态的,在写一个日期控件的时候,要把用户的选择控制在今天和一定期限的时间之间,当初是使用javascript的date函数来获取今天的时间,但是今天用户反映,怎么选择的时间怎么比预想的时间少了两年,后来发现,他的系统时间比真实时间少了两年。狂ft阿
没办法,只能在服务器端给用户设定今天的时间了。
原来的代码如下:
<?
php
echo
"
<script>
"
;
if
(
$type
==
0
)
echo
"
var minDate = new Date();var time=minDate.getTime();time=time+280*24*3600*1000;var maxDate=new Date(time);
"
;
else
if
(
$type
==
1
||
$type
==
3
)
echo
"
var maxDate=new Date();var maxYear=maxDate.getFullYear();var minYear=maxYear-8;var minDate=new Date(minYear,0,1);
"
;
else
echo
"
var minDate= new Date();var time=minDate.getTime();time=time+365*24*3600*1000;var maxDate=new Date(time);
"
;
echo
"
</script>
"
;
?>
现在修改后的代码如下
<?
php
$newdate
=
date
(
"
Ymd
"
,
time
());
$newyear
=
(int)(
$newdate
/
10000
);
$newmonth
=
(int)((
$newdate
%
10000
)
/
100
);
$newmonth
=
$newmonth
-
1
;
$newday
=
$newdate
%
100
;
echo
"
<script>
"
;
if
(
$type
==
0
)
echo
"
var minDate = new Date(
"
.
$newyear
.
"
,
"
.
$newmonth
.
"
,
"
.
$newday
.
"
);var time=minDate.getTime();time=time+280*24*3600*1000;var maxDate=new Date(time);
"
;
else
if
(
$type
==
1
||
$type
==
3
)
echo
"
var maxDate=new Date(
"
.
$newyear
.
"
,
"
.
$newmonth
.
"
,
"
.
$newday
.
"
);var maxYear=maxDate.getFullYear();var minYear=maxYear-8;var minDate=new Date(minYear,0,1);
"
;
else
echo
"
var minDate= new Date(
"
.
$newyear
.
"
,
"
.
$newmonth
.
"
,
"
.
$newday
.
"
);var time=minDate.getTime();time=time+365*24*3600*1000;var maxDate=new Date(time);
"
;
echo
"
</script>
"
;
?>
除非有更变态的用户,先保存为静态页面,然后修改时间,保存后再提交,不过我想,小小的时间变量,不会造成sql注入吧?再说是select控件,用户不能对value进行更改的。
附录十两个date的使用方法:
JScript 语言参考

--------------------------------------------------------------------------------

Date 对象
启用基本存储器并取得日期和时间。

dateObj
=
new
Date()
dateObj
=
new
Date(dateVal)
dateObj
=
new
Date(year, month, date[, hours[, minutes[, seconds[,ms]]]])

参数
dateObj

必选项。要赋值为 Date 对象的变量名。

dateVal

必选项。如果是数字值,dateVal 表示指定日期与
1970
年
1
月
1
日午夜间全球标准时间 的毫秒数。如果是字符串,则 dateVal 按照 parse 方法中的规则进行解析。dateVal 参数也可以是从某些 ActiveX(R) 对象返回的 VT_DATE 值。

year

必选项。完整的年份,比如,
1976
(而不是
76
)。

month

必选项。表示的月份,是从
0
到
11
之间的整数(
1
月至
12
月)。

date

必选项。表示日期,是从
1
到
31
之间的整数。

hours

可选项。 如果提供了 minutes 则必须给出。表示小时,是从
0
到
23
的整数(午夜到 11pm)。

minutes

可选项。 如果提供了 seconds 则必须给出。表示分钟,是从
0
到
59
的整数。

seconds

可选项。 如果提供了 milliseconds 则必须给出。表示秒钟,是从
0
到
59
的整数。

ms

可选项。 表示毫秒,是从
0
到
999
的整数。

说明
Date 对象保存以毫秒为单位表示特定时间段。如果某个参数的值大于其范围或为负数,则存储的其他值将做相应的调整。例如,如果指定
150
秒,JScript 将该数字重新定义为
2
分
30
秒。

如果数字为 NaN,则表示该对象不代表特定的时间段。如果未向 Date 对象传递参数,它将被初始化为当前时间 (UTC)。在能够使用该对象前必须为其赋值。

Date 对象能够表示的日期范围约等于
1970
年
1
月
1
日前后各
285
,
616
年。

Date 对象具有两个不创建 Date 对象就可以调用的静态方法。它们是 parse 和 UTC。

错误
下面的示例演示了 Date 对象的用法。


function
DateDemo()
{
var d, s = "Today's date is: "; // 声明变量。
d = new Date(); // 创建 Date 对象。
s += (d.getMonth() + 1) + "/"; // 获取月份。
s += d.getDate() + "/"; // 获取日。
s += d.getYear(); // 获取年份。
return(s); // 返回日期。
}
属性
constructor 属性
|
prototype 属性

方法
getDate 方法
|
getDay 方法
|
getFullYear 方法
|
getHours 方法
|
getMilliseconds 方法
|
getMinutes 方法
|
getMonth 方法
|
getSeconds 方法
|
getTime 方法
|
getTimezoneOffset 方法
|
getUTCDate 方法
|
getUTCDay 方法
|
getUTCFullYear 方法
|
getUTCHours 方法
|
getUTCMilliSeconds 方法
|
getUTCMinutes 方法
|
getUTCMonth 方法
|
getUTCSeconds 方法
|
getVarDate 方法
|
getYear 方法
|
setDate 方法
|
setFullYear 方法
|
setHours 方法
|
setMilliSeconds 方法
|
setMinutes 方法
|
setMonth 方法
|
setSeconds 方法
|
setTime 方法
|
setUTCDate 方法
|
setUTCFullYear 方法
|
setUTCHours 方法
|
setUTCMilliseconds 方法
|
setUTCMinutes 方法
|
setUTCMonth 方法
|
setUTCSeconds 方法
|
setYear 方法
|
toGMTString 方法
|
toLocaleString 方法
|
toUTCString 方法
|
toString 方法
|
valueOf 方法
|
parse 方法
|
UTC 方法

要求
版本
1

请参阅
new
运算符
|
var
语句


--------------------------------------------------------------------------------
PHP 手册
后退 前进


date
(PHP
3
,
PHP
4
,
PHP
5
)

date
--
格式化一个本地时间/日期
说明
string
date
(
string
format [
,
int timestamp] )


返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为
time
()。

提示
:
自 PHP
5.1
.
0
起有几个有用的常量可用作标准的日期/时间格式来指定 format 参数。

注
:
有效的时间戳典型范围是格林威治时间
1901
年
12
月
13
日
20
:
45
:
54
到
2038
年
1
月
19
日
03
:
14
:
07
。(此范围符合
32
位有符号整数的最小值和最大值)。不过在 PHP
5.1
之前此范围在某些系统(如 Windows)中限制为从
1970
年
1
月
1
日到
2038
年
1
月
19
日。

注
:
要将字符串表达的时间转换成时间戳,应该使用
strtotime
()。此外一些数据库有一些函数将其时间格式转换成时间戳(例如
MySQL
的 UNIX_TIMESTAMP 函数)。


表格
1
.
格式字串可以识别以下 format 参数的字符串

format 字符 说明 返回值例子
日
---
---
d 月份中的第几天,有前导零的
2
位数字
01
到
31
D 星期中的第几天,文本表示,
3
个字母 Mon 到 Sun
j 月份中的第几天,没有前导零
1
到
31
l(“L”的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday
N ISO
-
8601
格式数字表示的星期中的第几天(PHP
5.1
.
0
新加)
1
(表示星期一)到
7
(表示星期天)
S 每月天数后面的英文后缀,
2
个字符 st,nd,rd 或者 th。可以和 j 一起用
w 星期中的第几天,数字表示
0
(表示星期天)到
6
(表示星期六)
z 年份中的第几天
0
到
366
星期
---
---
W ISO
-
8601
格式年份中的第几周,每周从星期一开始(PHP
4.1
.
0
新加的) 例如:
42
(当年的第
42
周)
月
---
---
F 月份,完整的文本格式,例如 January 或者 March January 到 December
m 数字表示的月份,有前导零
01
到
12
M 三个字母缩写表示的月份 Jan 到 Dec
n 数字表示的月份,没有前导零
1
到
12
t 给定月份所应有的天数
28
到
31
年
---
---
L 是否为闰年 如果是闰年为
1
,否则为
0
o ISO
-
8601
格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP
5.1
.
0
新加) Examples
:
1999
or
2003
Y
4
位数字完整表示的年份 例如:
1999
或
2003
y
2
位数字表示的年份 例如:
99
或
03
时间
---
---
a 小写的上午和下午值 am 或 pm
A 大写的上午和下午值 AM 或 PM
B Swatch Internet 标准时
000
到
999
g 小时,
12
小时格式,没有前导零
1
到
12
G 小时,
24
小时格式,没有前导零
0
到
23
h 小时,
12
小时格式,有前导零
01
到
12
H 小时,
24
小时格式,有前导零
00
到
23
i 有前导零的分钟数
00
到
59
>
s 秒数,有前导零
00
到
59
>
时区
---
---
e 时区标识(PHP
5.1
.
0
新加) 例如:UTC,GMT,Atlantic
/
Azores
I 是否为夏令时 如果是夏令时为
1
,否则为
0
O 与格林威治时间相差的小时数 例如:
+
0200
T 本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“Eastern Standard
Time
”,中文版会显示“中国标准时间”)。
Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。
-
43200
到
43200
完整的日期/时间
---
---
c ISO
8601
格式的日期(PHP
5
新加)
2004
-
02
-
12T15
:
19
:
21
+
00
:
00
r RFC
822
格式的日期 例如:Thu
,
21
Dec
2000
16
:
01
:
07
+
0200
U 从 Unix 纪元(January
1
1970
00
:
00
:
00
GMT)开始至今的秒数 参见
time
()


格式字串中不能被识别的字符将原样显示。Z 格式在使用
gmdate
() 时总是返回
0
。

例子
1
.
date
() 例子

<?
php
//
设定要用的默认时区。自 PHP 5.1 可用
date_default_timezone_set(
'
UTC
'
);


//
输出类似:Monday
echo
date
(
"
l
"
);

//
输出类似:Monday 15th of August 2005 03:12:46 PM
echo
date
(
'
l dS \of F Y h:i:s A
'
);

//
输出:July 1, 2000 is on a Saturday
echo
"
July 1, 2000 is on a
"
.
date
(
"
l
"
,
mktime
(
0
,
0
,
0
,
7
,
1
,
2000
));

/*
在格式参数中使用常量
*/
//
输出类似:Mon, 15 Aug 2005 15:12:46 UTC
echo
date
(DATE_RFC822);

//
输出类似:2000-07-01T00:00:00+0000
echo
date
(DATE_ATOM
,
mktime
(
0
,
0
,
0
,
7
,
1
,
2000
));
?>


在格式字串中的字符前加上反斜线来转义可以避免它被按照上表解释。如果加上反斜线后的字符本身就是一个特殊序列,那还要转义反斜线。 例子
2
.
在
date
() 中转义字符

<?
php
//
prints something like: Wednesday the 15th
echo
date
(
"
l \\t\h\e jS
"
);
?>


可以把
date
() 和
mktime
() 结合使用来得到未来或过去的日期。 例子
3
.
date
() 和
mktime
() 例子

<?
php
$tomorrow
=
mktime
(
0
,
0
,
0
,
date
(
"
m
"
)
,
date
(
"
d
"
)
+
1
,
date
(
"
Y
"
));
$lastmonth
=
mktime
(
0
,
0
,
0
,
date
(
"
m
"
)
-
1
,
date
(
"
d
"
)
,
date
(
"
Y
"
));
$nextyear
=
mktime
(
0
,
0
,
0
,
date
(
"
m
"
)
,
date
(
"
d
"
)
,
date
(
"
Y
"
)
+
1
);
?>


注
:
由于夏令时的缘故,这种方法比简单地在时间戳上加减一天或者一个月的秒数更可靠。


一些使用
date
() 格式化日期的例子。注意要转义所有其它的字符,因为目前有特殊含义的字符会产生不需要的结果,而其余字符在 PHP 将来的版本中可能会被用上。当转义时,注意用单引号以避免类似 \n 的字符变成了换行符。 例子
4
.
date
() 格式举例

<?
php
//
假定今天是:March 10th, 2001, 5:16:18 pm
$today
=
date
(
"
F j, Y, g:i a
"
);
//
March 10, 2001, 5:16 pm
$today
=
date
(
"
m.d.y
"
);
//
03.10.01
$today
=
date
(
"
j, n, Y
"
);
//
10, 3, 2001
$today
=
date
(
"
Ymd
"
);
//
20010310
$today
=
date
(
'
h-i-s, j-m-y, it is w Day z
'
);
//
05-16-17, 10-03-01, 1631 1618 6 Fripm01
$today
=
date
(
'
\i\t \i\s \t\h\e jS \d\a\y.
'
);
//
It is the 10th day.
$today
=
date
(
"
D M j G:i:s T Y
"
);
//
Sat Mar 10 15:16:08 MST 2001
$today
=
date
(
'
H:m:s \m \i\s\ \m\o\n\t\h
'
);
//
17:03:17 m is month
$today
=
date
(
"
H:i:s
"
);
//
17:16:17
?>


要格式化其它语种的日期,应该用
setlocale
() 和
strftime
() 函数来代替
date
()。

参见
getlastmod
(),
gmdate
(),
mktime
(),
strftime
() 和
time
()。
没办法,只能在服务器端给用户设定今天的时间了。
原来的代码如下:










现在修改后的代码如下















除非有更变态的用户,先保存为静态页面,然后修改时间,保存后再提交,不过我想,小小的时间变量,不会造成sql注入吧?再说是select控件,用户不能对value进行更改的。
附录十两个date的使用方法:




































































































































































































































