Обновите часы в режиме реального времени, передав переменную из PHP в JavaScript

Я могу заставить часы показывать правильное время на основе $time_zone1. Все идет нормально. Единственная проблема в том, что часы обновляются не каждую секунду или вообще. Я боролся с решением, в котором время создается в javascript (вместо использования $current_time_formatted), но это не сработало, поскольку javascript всегда создавал часы, используя мое местное время вместо времени, установленного в $time_zone1.

Кроме того, я хочу иметь возможность изменить «Америку/Нью_Йорк» на другой часовой пояс. Итак, в PHP я получу определенный часовой пояс, скажем, сейчас $time_zone='Europe/London'. Итак, каким-то образом мне нужно указать javascript, чтобы он создавал часы для «Европы/Лондона» вместо «Америки/Нью_Йорка». То есть,

$time_zone1 = new DateTime('now', new DateTimeZone($time_zone))
<?php
// Create a DateTime object for the current time
// 'America/New_York', 'Europe/London', 'Asia/Tokyo'
$time_zone1 = new DateTime('now', new DateTimeZone('America/New_York'));

// Format the current time
$current_time_formatted = $time_zone1->format('H:i:s');
?>

<!-- Display the clock -->
<div id = "clock"><?php echo $current_time_formatted; ?> America/New_York</div>

<!-- JavaScript for updating the clock -->
<script>
function updateTime() {
    // Get the clock element
    var clock = document.getElementById('clock');
    
    // Update the clock display using the PHP variable directly
    clock.innerHTML = '<?php echo $current_time_formatted; ?>' + ' America/New_York';
}

// Update the clock every second
setInterval(updateTime, 1000);
</script>

echo $current_time_formatted заполняется, когда код PHP запускается один раз на сервере, он не будет меняться каждый раз, когда вы вызываете updateTime(), если только вы не вызовете сервер снова. Ваш JS-код запускается в браузере, поэтому он показывает местное время, а не время сервера.

droopsnoot 02.05.2024 09:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете указать время в JavaScript для определенного часового пояса, используя Intl.DateTimeFormat

<?php
$time_zone = "America/New_York";
?>

<!-- Display the clock -->
<div id = "clock"> <?php echo $time_zone; ?></div>

<!-- JavaScript for updating the clock -->
<script src = "https://code.jquery.com/jquery-3.7.1.min.js" integrity = "sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo = " crossorigin = "anonymous"></script>
<script>
    $(document).ready(function() {
        function updateTime() {
            let options = {
                timeZone: "<?php echo $time_zone; ?>",
                timeStyle: 'medium',
            };

            formatter = new Intl.DateTimeFormat([], options);

            // Get the clock element
            var clock = document.getElementById('clock');

            // Update the clock display using the PHP variable directly
            clock.innerHTML = formatter.format(new Date()) + ' <?php echo $time_zone; ?>';
        }

        // Update the clock every second
        setInterval(updateTime, 1000);
    })
</script>

Спасибо. Я обновил свой вопрос. Дело в том, что я не хочу, чтобы код был статическим только для timeZone: «Америка/Нью_Йорк». Я хочу иметь возможность получать часовой пояс в PHP и использовать его для JavaScript.

user23427046 02.05.2024 09:30

Обновлен код в соответствии с требованиями вопросов.

Anand 02.05.2024 09:34

Большое спасибо!! Можно ли изменить clock.innerHTML = formatter.format(new Date()) + 'America/New_York'; также?

user23427046 02.05.2024 09:37

Проверьте, работает ли обновленный код... вы можете обновить $time_zone до «Азия/Токио», чтобы проверить

Anand 02.05.2024 09:40

Вы можете расширить идею простых часов, используя простой custom-component, чтобы все функции часов были автономными и легко настраивались с помощью PHP для записи необходимого часового пояса в элемент HTML.

Класс пользовательского компонента использует Intl.DateTimeFormat для отображения времени в выбранном вами формате, который снова можно настроить путем редактирования атрибутов набора данных для компонента.

class SimpleClock extends HTMLElement{
    static get observedAttributes(){ 
      return [
        'data-timeZone',
        'data-timeStyle'
      ]
    };

    constructor(){
      const self=super();
      this.shadow=this.attachShadow( { mode:'open' } );
    };

    create(){
      return new Promise( ( resolve, reject )=>{
        let style=document.createElement('style');
            style.textContent=`
            div{
              width: 150px;
              border: 2px solid grey;
              border-radius: 0.5rem;
              padding: 0.5rem;
              margin: 0.5rem 0.25rem;
              
              display: flex;
              flex-direction: column;
              justify-content: center;
              align-items: center;
              
              color: grey;
              background: whitesmoke;
              box-shadow: 0 0 0.5rem silver;
              font-family: monospace;
              font-size: 0.95rem;
            }
            
            div:after{
              content: attr(data-timezone);
              color: black;
              font-size: smaller;
            }
            
            div:before{
              content:attr(data-time)
            }`;
        this.shadow.appendChild( style );
        this.node=this.shadow.appendChild( document.createElement('div') );
        this.node.dataset.timezone=this.dataset.timezone;
        resolve( true )
      });
    };

    render(){
      return new Promise( ( resolve, reject )=>{
        const IntlDateFormatter=function( date, args = {} ){
          let options=Object.assign( 
            { timeStyle:'short', timeZone:'Europe/London' }, 
            args 
          );
          return new Intl.DateTimeFormat( [], options ).format( date )
        };
        
        let args = {
           timeZone:this.dataset.timezone,
           timeStyle:this.dataset.timestyle
        }
        
        this.node.dataset.time=IntlDateFormatter( new Date(), args );
        resolve( true );
      });
    };

    connectedCallback(){
      this.create()
        .then( bool=>setInterval( this.render.bind( this ), 1000 ) )
        .catch( console.info )
    };
  }
  
  window.customElements.define( 'simple-clock', SimpleClock );
simple-clock{
  display:inline-block;
  margin:1rem 0.5rem;
}
<simple-clock data-timeZone='Europe/London' data-timeStyle='long'></simple-clock>
<simple-clock data-timeZone='Europe/Paris' data-timeStyle='long'></simple-clock>
<simple-clock data-timeZone='Europe/Dublin' data-timeStyle='medium'></simple-clock>
<simple-clock data-timeZone='America/New_York' data-timeStyle='medium'></simple-clock>
<!--

<simple-clock data-timeZone='<?php echo $time_zone1;?>' data-timeStyle='medium'></simple-clock>
-->

Другие вопросы по теме