我有一个网页,有三个下拉菜单,分别是日、月和年。如果我使用JavaScript Date构造函数接受数字,那么我得到一个Date对象为我的当前时区:

new Date(xiYear, xiMonth, xiDate)

给出正确的日期,但由于夏令时,它认为日期是GMT+01:00。

这里的问题是,然后我将这个日期传递给一个Ajax方法,当日期在服务器上被反序列化时,它已经转换为GMT,因此失去了一个小时,这将一天往回移动了一个小时。 现在我可以将日、月和年分别传递到Ajax方法中,但似乎应该有更好的方法。

接受的答案为我指明了正确的方向,但是仅仅使用setUTCHours()本身就改变了:

Apr 5th 00:00 GMT+01:00 

to

Apr 4th 23:00 GMT+01:00

然后,我还必须设置UTC日期、月份和年份

Apr 5th 01:00 GMT+01:00

这正是我想要的


当前回答

我不相信这是可能的-没有能力设置一个日期对象的时区后,它被创建。

在某种程度上,这是有道理的——在概念上(如果不是在实施中);per http://en.wikipedia.org/wiki/Unix_timestamp(强调我):

Unix时间,或POSIX时间,是一种描述时间瞬间的系统,定义为自1970年1月1日星期四午夜协调世界时(UTC)以来经过的秒数。

一旦你构建了一个,它将代表“真实”时间中的某个点。只有当您希望将抽象时间点转换为人类可读的字符串时,时区才有意义。

因此,只能更改Date在构造函数中表示的实际时间是有道理的。遗憾的是,似乎没有办法传递一个显式的时区-你正在调用的构造函数(可以说是正确的)将你的“本地”时间变量转换为GMT时,它正常存储它们-所以没有办法使用int, int, int构造函数为GMT时间。

从好的方面来说,只使用接受String的构造函数是很简单的。您甚至不需要将数字月份转换为字符串(至少在Firefox上),所以我希望一个简单的实现可以工作。然而,在尝试之后,它在Firefox、Chrome和Opera中成功工作,但在Konqueror(“无效日期”)、Safari(“无效日期”)和IE(“NaN”)中失败。我猜你只需要一个查找数组来将月份转换为字符串,就像这样:

var months = [ '', 'January', 'February', ..., 'December'];

function createGMTDate(xiYear, xiMonth, xiDate) {
   return new Date(months[xiMonth] + ' ' + xiDate + ', ' + xiYear + ' 00:00:00 GMT');
}

其他回答

单线解决方案

new Date(new Date(1422524805305).getTime() - 330*60*1000)

使用以毫秒为单位的时间戳,而不是1422524805305 不要使用330,而是使用您的时区偏移量(分钟wrt)。格林尼治时间(例如印度+5:30是5*60+30 = 330分钟)

这适用于不同时区(IST, PST,墨西哥,中美洲):

let dateUtc: any = new Date(Date.parse(data.details.dateOfBirth));

dateUtc = new Date(dateUtc.getTime() + Math.abs(dateUtc.getTimezoneOffset()*60000));

console.log(dateUtc);

这段代码将返回使用浏览器时区格式化的Date对象。

Date.prototype.timezone = function () {
    this.setHours(this.getHours() + (new Date().getTimezoneOffset() / 60));
    return this;
}

编辑:

为了避免污染Date API,可以将上述函数转换为实用函数。该函数接受一个Date对象,并返回一个变化的Date对象。

function setTimeZone(date) {
    date.setHours(date.getHours() + (new Date().getTimezoneOffset() / 60));
    return date;
}

GMT -03:00示例

new Date(new Date()-3600*1000*3).toISOString();  // 2020-02-27T15:03:26.261Z

甚至

now  = new Date().getTime()-3600*1000*3; // 1582818380528
data = new Date(now).toISOString();      // 2020-02-27T15:03:26.261Z

getTimeZoneOffset为UTC + z的减号。

var d = new Date(xiYear, xiMonth, xiDate);
if(d.getTimezoneOffset() > 0){
    d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
}