我有一个网页,其中有三个下拉菜单,分别是日,月和年。 如果我使用带数字的JavaScript Date
构造函数,则将获得当前时区的Date
对象:
new Date(xiYear, xiMonth, xiDate)
输入正确的日期,但由于夏令时,它认为该日期为GMT + 01:00。
这里的问题是,我随后将此Date
传递给Ajax方法,并且在服务器上反序列化该日期时,该日期已转换为GMT,因此浪费了一个小时,从而使这一天倒退了一个小时。 现在,我可以将日期,月份和年份分别传递给Ajax方法,但是似乎应该有一个更好的方法。
可接受的答案为我指明了正确的方向,但是仅使用setUTCHours()
本身就发生了变化:
Apr 5th 00:00 GMT+01:00
至
Apr 4th 23:00 GMT+01:00
然后,我还必须设置UTC日期,月份和年份,最后以
Apr 5th 01:00 GMT+01:00
这就是我想要的。
#1楼
我相信您需要createDateAsUTC函数(请与convertDateToUTC比较)
function createDateAsUTC(date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
function convertDateToUTC(date) {
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
#2楼
如果要处理从年,月,日等日期( 包括时区)创建Javascript Date对象(即,如果要将字符串解析为Date)的稍微不同但相关的问题,那么您可以显然必须做一个令人难以置信的复杂舞蹈:
// parseISO8601String : string -> Date
// Parse an ISO-8601 date, including possible timezone,
// into a Javascript Date object.
//
// Test strings: parseISO8601String(x).toISOString()
// "2013-01-31T12:34" -> "2013-01-31T12:34:00.000Z"
// "2013-01-31T12:34:56" -> "2013-01-31T12:34:56.000Z"
// "2013-01-31T12:34:56.78" -> "2013-01-31T12:34:56.780Z"
// "2013-01-31T12:34:56.78+0100" -> "2013-01-31T11:34:56.780Z"
// "2013-01-31T12:34:56.78+0530" -> "2013-01-31T07:04:56.780Z"
// "2013-01-31T12:34:56.78-0330" -> "2013-01-31T16:04:56.780Z"
// "2013-01-31T12:34:56-0330" -> "2013-01-31T16:04:56.000Z"
// "2013-01-31T12:34:56Z" -> "2013-01-31T12:34:56.000Z"
function parseISO8601String(dateString) {
var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\.[0-9]*)?)?(?:([+-])([0-9]{2})([0-9]{2}))?/;
var m = timebits.exec(dateString);
var resultDate;
if (m) {
var utcdate = Date.UTC(parseInt(m[1]),
parseInt(m[2])-1, // months are zero-offset (!)
parseInt(m[3]),
parseInt(m[4]), parseInt(m[5]), // hh:mm
(m[6] && parseInt(m[6]) || 0), // optional seconds
(m[7] && parseFloat(m[7])*1000) || 0); // optional fraction
// utcdate is milliseconds since the epoch
if (m[9] && m[10]) {
var offsetMinutes = parseInt(m[9]) * 60 + parseInt(m[10]);
utcdate += (m[8] === '+' ? -1 : +1) * offsetMinutes * 60000;
}
resultDate = new Date(utcdate);
} else {
resultDate = null;
}
return resultDate;
}
也就是说,您使用不带时区的日期创建一个“ UTC时间”(因此您知道它所在的语言环境,即UTC“语言环境”,并且未默认为本地语言环境),然后手动应用指示的时区偏移量。
如果有人实际考虑了Javascript日期对象超过五分钟,那不是很好吗?
#3楼
var d = new Date(xiYear, xiMonth, xiDate);
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
该答案是专门为原始问题量身定做的,不会提供您必然期望的答案。 特别是,有些人会希望减去时区偏移而不是添加。 请记住,尽管此解决方案的重点是针对特定的反序列化破解javascript的date对象,但并非在所有情况下都是正确的。
#4楼
我从中看到的最佳解决方案来自
http://www.codingforums.com/archive/index.php/t-19663.html
打印时间功能
<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)
function printTime(offset) {
offset++;
tempDate = new Date()
tempDate.setTime(UTCDate.getTime()+3600000*(offset))
timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
timeValue += " hrs."
return timeValue
}
var now = new Date()
var seed = now.getTime() % 0xfffffff
var same = rand(12)
</script>
Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>
完整代码示例
<html>
<head>
<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)
function printTime(offset) {
offset++;
tempDate = new Date()
tempDate.setTime(UTCDate.getTime()+3600000*(offset))
timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
timeValue += " hrs."
return timeValue
}
var now = new Date()
var seed = now.getTime() % 0xfffffff
var same = rand(12)
</script>
</head>
<body>
Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>
<br>
Michigan:
<script language="JavaScript">document.write(printTime("-5"))</script>
<br>
Greenwich, England(UTC):
<script language="JavaScript">document.write(printTime("-0"))</script>
<br>
Tokyo, Japan:
<script language="JavaScript">document.write(printTime("+9"))</script>
<br>
Berlin, Germany:
<script language="JavaScript">document.write(printTime("+1"))</script>
</body>
</html>
#5楼
对于UTC + z,getTimeZoneOffset为负。
var d = new Date(xiYear, xiMonth, xiDate);
if(d.getTimezoneOffset() > 0){
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
}
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3164615