2014-10-02 2 views
0

Итак, я стараюсь использовать время, которое является широко используемым приложением, и отображать его в часовом поясе пользователя. Вот что я сработал и работает. Однако я уверен, что есть лучший способ сделать это. Начальный часовой пояс всегда будет центральным. Central = 5. Меня интересуют только часовые пояса США, но если есть простой способ реализовать его во всем мире, я тоже с этим справляюсь. Текстовый ярлык, с которым я работаю, будет отображаться как 4:00 PM, поэтому существует так много подстроки.Дата трансляции Javascript по часовой пояс

function timeZones() { 
    var timezone = new Date().getTimezoneOffset(); 
    timezone = timezone/60; 
    //STARTING TIMEZONE WILL ALWAYS BE CENTRAL 
    var difference = 5 - timezone; 
    $(".time-zone").each(function() { 
     var a = $(this).text(); 
     var hour = a.substring(0, a.indexOf(":") - 1); 
     hour = parseInt(a); 
     var yourTime; 
     //East Coast 
     if (difference == 1) { 
      hour = hour + difference; 
      if (hour == 12) { 
       yourTime = hour + a.substring(a.indexOf(":"), a.indexOf("A") - 1) + "PM"; 
      } 
      else if (hour > 12) { 
       hour = hour - 12; 
       yourTime = hour + a.substring(a.indexOf(":"), a.indexOf("A") - 1) + "PM"; 
      } 
      else { 
       yourTime = hour + a.substring(a.indexOf(":")); 
      } 
      $(this).text(yourTime); 
     } 
     //Mountain 
     if (difference == -1) { 
      hour = hour + difference; 
      if (hour == 0) { 
       hour = 12; 
       yourTime = hour + a.substring(a.indexOf(":")); 
      } 
      else if (hour < 0) { 
       hour = 12 + hour; 
       yourTime = hour + a.substring(a.indexOf(":"), a.indexOf("P") - 1) + "AM"; 
      } 
      else { 
       yourTime = hour + a.substring(a.indexOf(":")); 
      } 
      $(this).text(yourTime); 
     } 
     //West Coast 
     if (difference == -2) { 
      hour = hour + difference; 
      if (hour == 0) { 
       hour = 12; 
       yourTime = hour + a.substring(a.indexOf(":")); 
      } 
      else if (hour < 0) { 
       hour = 12 + hour; 
       yourTime = hour + a.substring(a.indexOf(":"), a.indexOf("P") - 1) + "AM"; 
      } 
      else { 
       yourTime = hour + a.substring(a.indexOf(":")); 
      } 
      $(this).text(yourTime); 
     } 
     //Alaska 
     if (difference == -3) { 
      hour = hour + difference; 
      if (hour == 0) { 
       hour = 12; 
       yourTime = hour + a.substring(a.indexOf(":")); 
      } 
      else if (hour < 0) { 
       hour = 12 + hour; 
       yourTime = hour + a.substring(a.indexOf(":"), a.indexOf("P") - 1) + "AM"; 
      } 
      else { 
       yourTime = hour + a.substring(a.indexOf(":")); 
      } 
      $(this).text(yourTime); 
     } 
    }); 
} 
+0

Я думаю, вам стоит взглянуть на библиотеку времени timezone вместо того, чтобы пытаться реализовать это. Это избавит вас от многих головных болей. – Tuan

+0

Их так много. Какой из них вы бы порекомендовали? –

+2

Это тот, о котором я говорил: http://momentjs.com/ – Tuan

ответ

1

Вы сказали:

Начальный часовой пояс всегда будет центральным. Central = 5.

Это неверно. Часовой пояс и смещение часового пояса: не То же самое. Центральная часовая зона США использует зиму UTC-6 зимой и использует смещение UTC-5 летом, когда действует daylight saving time. Вы не можете жестко закодировать любой из них. См. Также «Часовой пояс! = Смещение» в the timezone tag wiki.

Если вам нужно работать с нелокальными часовыми поясами в JavaScript, вам понадобится библиотека, такая как список here. Например, вот как вы можете это сделать, используя moment-timezone - это дополнение для библиотеки moment.js.

moment.tz('2014-10-02 01:23:00','America/Chicago').local().format('YYYY-MM-DD h:mm a') 

В приведенном выше примере анализируется локальная дата/время в Чикаго (Центральное время США). Затем он преобразуется в любой часовой пояс, в котором работает браузер пользователя (с функцией local). Затем он форматируется как строка в соответствии с указанным форматом.

+0

3 года спустя в моей карьере программирования я научился всегда использовать Momentjs и перестать пытаться переделать колесо. Честно говоря, проблема с этим старым кодом заключалась в том, что компания, в которой я работала в то время, не сохраняла их даты как UTC. –

0

Что-то я бросил вместе

// timezone_out optional = local timezone 
function timeConversionGenerator(timezone_in, timezone_out) { 
    if (undefined === timezone_out) 
     timezone_out = new Date().getTimezoneOffset(); 
    var d = timezone_in - timezone_out; 
    return function (time) { 
     var hh = time.hh, 
      mm = time.mm + d, 
      ss = time.ss; 
     while (mm < 0) mm += 60, hh -= 1; 
     while (mm >= 60) mm -= 60, hh += 1; 
     while (hh < 0) hh += 24; 
     hh %= 24; 
     return { 
      hh: hh, 
      mm: mm, 
      ss: ss 
     }; 
    } 
} 

var c = timeConversionGenerator(5 * 60); // 5 hours behind UTC to local time 

Теперь

c({ 
    hh: 13, 
    mm: 18, 
    ss: 0 
}); 
/* converted to my local time (British Summer Time) 
{ 
    hh: 19, 
    mm: 18, 
    ss: 0 
} 
*/ 

Тогда

function toAMPMString(time) { 
    return ((time.hh % 12) || 12) 
     + ':' 
     + (time.mm < 10 ? '0' : '') + time.mm 
     + ' ' + (time.hh < 12 ? 'AM' : 'PM'); 
} 

// so 
toAMPMString(c({ hh: 13, mm: 18, ss: 0})); // "7:18 PM" 
Смежные вопросы