Текущая дата/время по восточному времени

Есть ли простой (или в противном случае хороший) способ получить текущую дату и время по восточному времени, допускающий возможную экономию летнего времени в текущем и целевом часовых поясах? (America/New_York, я полагаю, является реальной целью для тех, кто использует tz.)

Основная сложность, конечно же, заключается в том, чтобы узнать, какой текущий часовой пояс используется в Нью-Йорке (EST или EDT). Может ли Javascript сделать это? Или есть хорошие библиотеки для него? Я опасаюсь жесткого кодирования вычислений, потому что мой код устареет, когда будут приняты новые законы (где библиотеки, скорее всего, будут обновляться, а языки - еще больше).


person Charles    schedule 12.03.2012    source источник
comment
Вы хотите показывать конкретное время и не использовать время из системы пользователя?   -  person lmcanavals    schedule 12.03.2012
comment
Вы можете найти ответ на странице w3schools.com/js/js_obj_date.asp.   -  person Hope4You    schedule 12.03.2012
comment
@MartínCanaval: Да, верно. Для простоты представьте, что я показываю диалоговое окно: Текущее время в Нью-Йорке с поправкой на летнее время: _____.   -  person Charles    schedule 12.03.2012
comment
@zaf: Эта тема посвящена гораздо более простому вопросу: как преобразовать текущее время пользователя в EDT? У меня сложнее, потому что нужно знать, когда (скажем) Нью-Йорк использует EST, а когда EDT.   -  person Charles    schedule 12.03.2012
comment
@Charles Как насчет stackoverflow.com/questions/1194933/   -  person zaf    schedule 12.03.2012
comment
@zaf: Это дает мне текущий часовой пояс, но не в какой (EST или EDT) конвертировать.   -  person Charles    schedule 12.03.2012


Ответы (1)


(Это слишком сложно сделать только для одного часового пояса.) Это возвращает строки для часовых поясов США с текущими правилами перехода на летнее время.

Вам понадобятся правила начала и окончания перехода на летнее время для любой зоны, которую вы добавляете.

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
person kennebec    schedule 12.03.2012
comment
Правильно ли меняется дата, если она отличается от местного часового пояса и восточного времени? - person Charles; 13.03.2012