我有一个网页,有三个下拉菜单,分别是日、月和年。如果我使用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

这正是我想要的


当前回答

我使用了timezone-js包。

var timezoneJS  = require('timezone-js');
var tzdata = require('tzdata');

createDate(dateObj) {
    if ( dateObj == null ) {
        return null;
    }
    var nativeTimezoneOffset = new Date().getTimezoneOffset();
    var offset = this.getTimeZoneOffset();

    // use the native Date object if the timezone matches
    if ( offset == -1 * nativeTimezoneOffset ) {
        return dateObj;
    }

    this.loadTimeZones();

    // FIXME: it would be better if timezoneJS.Date was an instanceof of Date
    //        tried jquery $.extend
    //        added hack to Fiterpickr to look for Dater.getTime instead of "d instanceof Date"
    return new timezoneJS.Date(dateObj,this.getTimeZoneName());
},

其他回答

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

这个答案是专门为最初的问题量身定制的,不会给出你所期望的答案。特别是,有些人想要减去时区偏移量,而不是加上它。记住,这个解决方案的重点是针对特定的反序列化破解javascript的date对象,而不是在所有情况下都正确。

使用. settutchours()可以实际设置utc时间的日期,这将允许您在整个系统中使用utc时间。

但是不能在构造函数中使用UTC设置它,除非指定日期字符串。

使用新的日期(日期。UTC(年,月,日,小时,分,秒)),您可以从特定的UTC时间创建一个日期对象。

这对我很管用。但不确定这是不是一个好主意。

var myDate = new Date(); 控制台。(“myDate:日志”,myDate);// myDate:“2018- 04-04-01:09 9:38,112z。” var偏移= +5;如果timeZone是5 var MyDateWithOffset = new Date(最新消息) 控制台。(“MyDateWithOffset:日志”,MyDateWithOffset);// myDateWithOffset:“2018- 04-03-020:09:38,000z”

有多少里程

var d = new Date(xiYear, xiMonth, xiDate).toLocaleString();

当我创建一个日期对象:

日期(年、月、日、时、分)

我在本地主机上工作得很好。 当我部署到服务器时,它崩溃了,因为服务器在另一个时区。

我不能使用getTimezoneOffset()。我需要我的家的时区偏移-取决于夏季/冬季时间

// add diff minutes between myself (HOME) and server 
timezoneHomeOffset (d, tz = 'Europe/Copenhagen') {
  const utc = new Date(d.getTime())
  const dHome = new Date(d.toLocaleString('en-US', { timeZone: tz }))
  const diff = Math.round((utc - dHome) / 60000) // 60*1000 => minutes
  d.setMinutes(d.getMinutes() + diff)
  return d
}