关于javascript:ET中的当前日期/时间

Current date/time in ET

本问题已经有最佳答案,请猛点这里访问。

是否有一种简单(或其他方面很好)的方式来获取东部时间的当前日期和时间,以便在当前和目标时区中节省可能的夏令时? ( America / New_York,我认为,对于那些使用tz的人来说,它是真正的目标。)

当然,主要的困难是找出纽约当前时区的使用情况(EST或EDT)。 Javascript可以这样做吗? 还是有好的图书馆吗? 我对计算的硬编码很谨慎,因为我的代码将在新法律通过时过时(库更可能更新,语言更多)。


(仅对一个时区执行此操作太麻烦了。)
这将返回具有当前dst规则的美国时区的字符串。

您需要为添加的任何区域设置dst开始和结束规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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('
'
);


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('
'
);


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