สอบถามเรื่อง jQuery new Date ค่าที่ได้ที่ Local กับ Server ไม่เท่ากัน

เริ่มโดย ChilTunDer, 09 สิงหาคม 2021, 22:04:07

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

ChilTunDer

เรามี string date 2021-08-09 11:12:10 เราใช้ new Date("2021-08-09 11:12:10") เพื่อแปลงเป็น object เนื่องจากเราต้องเอา Date ที่ได้ไปลบกับ date อีกค่านึง ทีนี้ค่า Date ที่แปลงได้คือ
Local: 1623152365215
Server: 18231526489465

ค่าข้างต้นเราสมมติขึ้นมานะ เราจำค่าจริงๆไม่ได้ แต่ Local จะได้ 13 หลักส่วน Server จะได้ 14 หลัก
ไม่แน่ใจว่าเกิดจากอะไร และจะแก้ปัญหานี้ได้อย่างไรค่ั

fremznginx

เวลา server ตรงรึเปล่าครับ ปกติ unix time จะเป็นตัวเลขตัวเดียวกันหมด แล้วค่อยไปแปลงในแต่ละ timezone เอง
รับทำเว็บไซต์ทุกรูปแบบ
รับ Tune Hosting ให้รองรับคนเข้าเยอะ ๆ

vii

timestamp มันไม่ถูกต้องหรือเปล่าครับ

1623152365215 แปลงเป็นวันที่ได้ 53405-08-27 00:00:15
18231526489465 แปลงได้ 579704-01-29 08:44:25
ลองเอาค่าจริงๆมาดูจะดีกว่าจะได้รู้ว่าของจริงๆมันเป็นยังไง

อันนี้ตัวอย่างโค้ดที่ผมเอาไว้ตรวจเวลาระหว่างเครื่องที่ใช้ (JS) กับ server (PHP).

<?php
header
("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");
header('Expires: 0'); // Proxies.


$timestamp time();
$phpdatetime date('Y-m-d H:i:s'$timestamp);


$headers = [];
$requestHeaders getallheaders();
if (
is_array($requestHeaders)) {
    foreach (
$requestHeaders as $key => $value) {
        
$headers[strtolower(trim($key))] = trim($value);
    }
    unset(
$key$value);
}
unset(
$requestHeaders);


if (
    isset(
$headers['accept']) && 
    (
        
stripos($headers['accept'], 'html') === false &&
        
stripos($headers['accept'], '*/*') === false
    
)
) {
    
header('Content-Type: application/json');

    
$output = [];
    
$output['datetime'] = $phpdatetime;
    
$output['timestamp'] = $timestamp;
    echo 
json_encode($output);
    unset(
$output);
    exit();
}
?>

<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8">
       <title>Date/time now</title>
       <meta http-equiv="x-ua-compatible" content="ie=edge">
       <meta name="viewport" content="width=device-width, initial-scale=1">
       <style type="text/css">
           table {
               border: 1px solid #ccc;
               border-collapse: collapse;
           }
           table td,
           table th {
               border: 1px solid #ccc;
               padding: 5px;
               text-align: left;
           }

           .not-matched-datetime {
               background-color: rgba(255, 0, 0, .3);
           }
       </style>
   </head>
   <body>
       <h1>Date/time</h1>
       <table>
           <thead>
               <tr>
                   <th>Server date/time</th>
                   <th>Your date/time</th>
               </tr>
           </thead>
           <tbody>
               <tr>
                   <td><span id="phpDateTime"><?php echo $phpdatetime?></span></td>
                   <td><span id="jsDateTime"></span></td>
               </tr>
               <tr>
                   <td><span id="phpTimestamp"><?php echo $timestamp?></span></td>
                   <td><span id="jsTimestamp"></span></td>
               </tr>
           </tbody>
       </table>

       <script>
           function addZero(number) {
               number = String(number);
               return number.padStart(2, '0');
           }

           function displayJSDatetime() {
               let Datetime = new Date();
               let dateString = Datetime.getFullYear()   '-'   addZero(parseInt(Datetime.getMonth())   1)   '-'   addZero(Datetime.getDate());
               dateString  = ' ';
               dateString  = addZero(Datetime.getHours())   ':'   addZero(Datetime.getMinutes())   ':'   addZero(Datetime.getSeconds());
               document.querySelector('#jsDateTime').innerHTML = dateString;
               document.querySelector('#jsTimestamp').innerHTML = Datetime.getTime();
           }

           document.addEventListener('DOMContentLoaded', (event) => {
               // display date/time of this device on load.
               displayJSDatetime();
               // then set interval to update them.
               let intervalId = setInterval(() => {
                   // display JS date/time on this device.
                   displayJSDatetime();

                   // ajax get server date/time.
                   fetch('<?php echo $_SERVER['REQUEST_URI']; ?>', {
                       headers: {
                           'Accept': 'application/json',
                           'Content-Type': 'application/x-www-form-urlencoded'
                       }
                   })
                   .then((response) => {
                       return response.json();
                   })
                   .then((response) => {
                       if (response.datetime) {
                           let phpDatetime = document.querySelector('#phpDateTime');
                           let jsDatetime = document.querySelector('#jsDateTime');
                           let phpTimestamp = document.querySelector('#phpTimestamp');
                           phpDatetime.innerHTML = response.datetime;
                           phpTimestamp.innerHTML = response.timestamp;

                           if (phpDatetime.innerHTML !== jsDatetime.innerHTML) {
                               jsDatetime.classList.add('not-matched-datetime');
                           } else {
                               jsDatetime.classList.remove('not-matched-datetime');
                           }
                       }
                   });
               }, 1000);
           });
       </script>
   </body>
</html>


จากโค้ดที่ผมใช้ JS, PHP จะได้หลักไม่เท่ากันแต่เวลาไม่ต่างกันครับ

ตัวอย่าง PHP 1629715239
JS 1629715239369