【问题标题】:Current date/time in ET [duplicate]ET中的当前日期/时间[重复]
【发布时间】:2012-03-12 14:48:41
【问题描述】:

是否有一种简单(或其他好的)方法可以获取东部时间的当前日期和时间,允许在当前时区和目标时区进行夏令时? (America/New_York,我想,对于那些使用 tz 的人来说,才是真正的目标。)

当然,主要的困难是找出纽约使用的当前时区(EST 或 EDT)。 Javascript可以做到这一点吗?或者有没有好的图书馆?我对硬编码计算持谨慎态度,因为当新法律通过时我的代码会过时(图书馆更可能更新,语言更多)。

【问题讨论】:

  • 是否要显示特定时间而不使用用户系统中的时间?
  • 您可以在w3schools.com/js/js_obj_date.asp找到答案
  • @MartínCanaval:是的,正确。为简单起见,假设我正在显示一个对话框:“纽约当前的夏令时调整时间是:_____”。
  • @zaf:该主题是关于一个更简单的问题“如何将用户的当前时间转换为 EDT?”。我的更难,因为它需要知道(比如说)纽约何时使用 EST 以及何时使用 EDT。

标签: javascript date timezone dst


【解决方案1】:

(只针对一个时区这样做太麻烦了。) 这将返回具有当前 dst 规则的美国时区的字符串。

对于您添加的任何区域,您都需要 dst 开始和结束规则

Date.toTZString= function(d, tzp){
    var short_months= ['Jan', 'Feb', 'Mar', 'Apr', 'May',
     'Jun', 'Jul','Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var h, m, pm= 'pm', off, label, str,
    d= d? new Date(d):new Date();

    var tz={
        AK:['Alaska', -540],
        A:['Atlantic', -240],
        C:['Central', -360],
        E:['Eastern', -300],
        HA:['Hawaii-Aleutian', -600],
        M:['Mountain', -420],
        N:['Newfoundland', -210],
        P:['Pacific', -480]
    }[tzp.toUpperCase()];

    //get the selected offset from the object:
    if(!tz) return d.toUTCString();
    off= tz[1];

    //get the start and end dates for dst:(these rules are US only)
    var     y= d.getUTCFullYear(), countstart= 8, countend= 1,
    dstart= new Date(Date.UTC(y, 2, 8, 2, 0, 0, 0)),
    dend= new Date(Date.UTC(y, 10, 1, 2, 0, 0, 0));
    while(dstart.getUTCDay()!== 0) dstart.setUTCDate(++countstart);
    while(dend.getUTCDay()!== 0) dend.setUTCDate(++countend);

    //get the GMT time for the localized dst start and end times:
    dstart.setUTCMinutes(off);
    dend.setUTCMinutes(off);

    // if the date passed in is between dst start and dst end, adjust the offset and label:
    if(dstart<= d && dend>= d){
        off+= 60;
        label= tzp+'dt';
    }
    else label= tzp+'st';

    //add the adjusted offset to the date and get the hours and minutes:
    d.setUTCMinutes(d.getUTCMinutes()+off);
    h= d.getUTCHours();
    m= d.getUTCMinutes();
    if(h> 12) h-= 12;
    else if(h!== 12) pm= 'am';
    if(h== 0) h= 12;
    if(m<10) m= '0'+m;

    //return a string:
    var str= short_months[d.getUTCMonth()]+' '+d.getUTCDate()+', ';
    return str+ h+':'+m+' '+pm+' '+label.toUpperCase();
}



//test1:
var d= new Date().toUTCString();
[d, Date.toTZString(d, 'E'), Date.toTZString(d, 'P')].join('\n');


Mon, 12 Mar 2012 17:46:30 GMT
Mar 12, 1:46 pm EDT
Mar 12, 10:46 am PDT

//test2:
var d=new Date(1352134800000).toUTCString();
[d,Date.toTZString(d, 'E'),Date.toTZString(d, 'P')].join('\n');


Mon, 05 Nov 2012 17:00:00 GMT
Nov 5, 12:00 pm EST
Nov 5, 9:00 am PST

【讨论】:

  • 当本地时区和东部时间不同时,日期是否正确翻转?
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 2014-10-18
  • 2016-07-04
  • 2023-04-01
  • 2013-06-16
  • 1970-01-01
  • 2021-11-06
  • 2019-05-21
相关资源
最近更新 更多