如何在JavaScript中保持不同时区的日期对象

如何在JavaScript中保持不同时区的日期对象,javascript,date,timezone,Javascript,Date,Timezone,在JavaScript中是否可以将日期对象保留在不同的时区,例如: date1.toString(); >>> 2012-02-16T14:00+02:00 date2.toString(); >>> 2012-03-16T13:00+01:00 i、 e.我有两个日期对象,它们反映同一时刻,但将其信息保留在不同的时区。否。JavaScript中的日期表示一个时刻;它们不存储时区信息。然后,您可以选择显示在特定时区中表示的时间。(请参阅各种方法,如getH

在JavaScript中是否可以将日期对象保留在不同的时区,例如:

date1.toString();
>>> 2012-02-16T14:00+02:00

date2.toString();
>>> 2012-03-16T13:00+01:00

i、 e.我有两个日期对象,它们反映同一时刻,但将其信息保留在不同的时区。

否。JavaScript中的日期表示一个时刻;它们不存储时区信息。然后,您可以选择显示在特定时区中表示的时间。(请参阅各种方法,如
getHours()
-当前本地时区与
getUTCHours()

要在UTC或本地以外的时区中显示时间,您需要编写(或使用)一个进行一些数学运算的函数:

function offsetDate( date, hours ){
  return date.setUTCHours( date.getUTCHours() + hours );
}
编辑:您可以选择存储自定义偏移量和日期(因为您可以向任何JS对象添加自定义属性):

Date.prototype.withZone=function(){
var o=new Date(this.getTime());//制作一个副本以进行变异
o、 setUTCHours(o.getUTCHours()+(this.tz | | 0));//移动UTC时间
//返回日期的自定义格式版本

var offset=this.tz?(this.tz据我所知,你不能设置它,但你可以得到它:这里有一个参考:


大多数浏览器支持toISOString()。AIK不支持转换回最新版本。
您可以找到一个跨浏览器支持的有效解决方案。

在内部,日期/时间与时区无关。时区仅应用于输出。注意:W3Schools通常是一个非常不可靠的信息源。有关详细信息,请参阅。谢谢,我知道了。但我不仅需要在特定时区中显示日期,还需要将其绑定到允许编辑时间组件的UI控件。该控件接受Date对象,用户始终必须查看特定时区中的时间。我最终将Date对象转换为所需时区,因此从技术上讲,日期值变得不正确,因为它在一个时区中显示时间,但Date对象内部保留信息关于另一个时区的信息。您知道避免这种情况的最佳做法吗?回答得好,我建议您添加代码以考虑夏令时?
Date.prototype.withZone = function(){
  var o = new Date(this.getTime());                // Make a copy for mutating
  o.setUTCHours(o.getUTCHours() + (this.tz || 0)); // Move the UTC time

  // Return a custom formatted version of the date
  var offset = this.tz ? (this.tz<0 ? this.tz : ('+'+this.tz)) : 'Z';
  return o.customFormat('#YYYY#-#MMM#-#D# @ #h#:#mm##ampm# ('+offset+')');
}

// http://phrogz.net/JS/FormatDateTime_js.txt
Date.prototype.customFormat = function(formatString){
  var YYYY,YY,MMMM,MMM,MM,M,DDDD,DDD,DD,D,hhh,hh,h,mm,m,ss,s,ampm,AMPM,dMod,th;
  YY = ((YYYY=this.getUTCFullYear())+"").slice(-2);
  MM = (M=this.getUTCMonth()+1)<10?('0'+M):M;
  MMM = (MMMM=["January","February","March","April","May","June","July","August","September","October","November","December"][M-1]).substring(0,3);
  DD = (D=this.getUTCDate())<10?('0'+D):D;
  DDD = (DDDD=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][this.getUTCDay()]).substring(0,3);
  th=(D>=10&&D<=20)?'th':((dMod=D%10)==1)?'st':(dMod==2)?'nd':(dMod==3)?'rd':'th';
  formatString = formatString.replace("#YYYY#",YYYY).replace("#YY#",YY).replace("#MMMM#",MMMM).replace("#MMM#",MMM).replace("#MM#",MM).replace("#M#",M).replace("#DDDD#",DDDD).replace("#DDD#",DDD).replace("#DD#",DD).replace("#D#",D).replace("#th#",th);
  h=(hhh=this.getUTCHours());
  if (h==0) h=24; if (h>12) h-=12;
  hh = h<10?('0'+h):h;
  AMPM=(ampm=hhh<12?'am':'pm').toUpperCase();
  mm=(m=this.getUTCMinutes())<10?('0'+m):m;
  ss=(s=this.getUTCSeconds())<10?('0'+s):s;
  return formatString.replace("#hhh#",hhh).replace("#hh#",hh).replace("#h#",h).replace("#mm#",mm).replace("#m#",m).replace("#ss#",ss).replace("#s#",s).replace("#ampm#",ampm).replace("#AMPM#",AMPM);
}

var now = new Date;            // Make a plain date
console.log( now.withZone() ); //-> 2012-Feb-16 @ 9:37pm (Z)
now.tz = -7;                   // Add a custom property for our method to use
console.log( now.withZone() ); //-> 2012-Feb-16 @ 2:37pm (-7)
var d = new Date()
var gmtHours = -d.getTimezoneOffset()/60;
document.write("The local time zone is: GMT " + gmtHours);