ช่วยแก้ปัญหา

Unix Timestamp วินาทีกับมิลลิวินาที: ทำไมวันที่ขึ้น 1970

ถ้า Unix timestamp กลายเป็นวันที่ใกล้ 1970 มักเป็นวินาทีที่อ่านเป็นมิลลิวินาที วิธีแยกหน่วยให้ถูก

คำตอบสั้น ๆ

ถ้า Unix timestamp ให้วันที่ใกล้ 1970 ค่ามักถูกตีความในหน่วยผิด

Unix timestamp มักใช้วินาที ส่วน Date ใน JavaScript มักใช้มิลลิวินาที

timestamp ยุคใหม่ 10 หลักมักเป็นวินาที ส่วน 13 หลักมักเป็นมิลลิวินาที ถ้าหน่วยไม่ตรง อาจต้องคูณหรือหารด้วย 1,000

คุณแปลง timestamp เป็นวันที่แล้วได้มกราคม 1970 นาฬิกาพังน้อยมาก ตัวเลขถูกอ่านเป็นมิลลิวินาทีทั้งที่เก็บเป็นวินาที—หรือกลับกัน

Unix timestamp คืออะไร

Unix timestamp นับเวลาตั้งแต่ Unix epoch: 1970-01-01 00:00:00 UTC โดยทั่วไปเป็นวินาทีเต็ม ช่วงเวลาเดียวกันอาจเก็บเป็นมิลลิวินาทีได้ (วินาที × 1,000) ตัวเลขเองไม่บอกหน่วย

วินาทีกับมิลลิวินาที: ต่างกัน 1,000 เท่า

1 วินาทีเท่ากับ 1,000 มิลลิวินาที เทียบ 1720000000 กับ 1720000000000 ถ้าตัวแรกเป็นวินาทีและตัวหลังเป็นมิลลิวินาที คือช่วงเวลาเดียวกัน อ่านตัวแรกเป็นมิลลิวินาที วันที่จะกระโดดไปทาง 1970

ผล UTC เหล่านี้คำนวณจากตัวเลขด้านบน ไม่ใช่การเดา

ค่า หน่วยที่เป็นไปได้ ความหมาย (UTC)
1720000000 วินาที วันที่สมัยใหม่เมื่ออ่านเป็นวินาที: 2024-07-03 09:46:40 UTC
1720000000000 มิลลิวินาที ช่วงเวลาเดียวกันเมื่ออ่านเป็นมิลลิวินาที: 2024-07-03 09:46:40 UTC
1720000000 ในฐานะมิลลิวินาที หน่วยผิด วันที่ใกล้ 1970: 1970-01-20 21:46:40 UTC

ทำไม timestamp ของฉันขึ้น 1970

ถ้าค่าวินาทีถูกมองเป็นมิลลิวินาที ตัวเลขจะเล็กกว่าที่ควร 1,000 เท่า JavaScript จะนับช่วงสั้น ๆ หลัง Unix epoch วันที่จึงอยู่ที่ 1970:

const seconds = 1720000000;

new Date(seconds);
// 1970-01-20 21:46:40 UTC

new Date(seconds * 1000);
// 2024-07-03 09:46:40 UTC

วันที่ 1970 นั้นคือ epoch บวกประมาณสองสัปดาห์ คูณวินาทีด้วย 1,000 ก่อนส่งให้ Date

  • วินาที (SECONDS)
  • 1720000000
  • มิลลิวินาที (MILLISECONDS)
  • 1720000000000
ช่วงเวลาเดียวกัน: วินาที × 1,000 = มิลลิวินาที
  • ค่าวินาที
  • ถูกเข้าใจผิดว่าเป็นมิลลิวินาที
  • วันที่ใกล้ 1970
ค่าวินาทีที่อ่านเป็นมิลลิวินาทีจะตกใกล้ Unix epoch
วินาทีหรือมิลลิวินาที

ถ้าผลใกล้ 1970 ให้ตรวจหน่วยของ timestamp ก่อนไปไล่เขตเวลา

10 หลักเป็นวินาที และ 13 หลักเป็นมิลลิวินาทีหรือ

สำหรับวันที่ยุคใหม่ 10 หลักมักเป็นวินาที และ 13 หลักมักเป็นมิลลิวินาที นี่เป็นเบาะแสเร็ว ไม่ใช่กฎตรวจความถูกต้อง จำนวนหลักเปลี่ยนตามช่วงเวลา และ API บางตัวเก็บไมโครวินาทีหรือนาโนวินาที ให้ยืนยันหน่วยจากเอกสารหรือวันที่ที่สมเหตุสมผล

ทำไมเรื่องนี้เกิดบ่อยใน JavaScript

ใน JavaScript ค่า Date แบบตัวเลขเป็นมิลลิวินาทีนับจาก epoch แบ็กเอนด์ ฐานข้อมูล และเครื่องมือ Unix จำนวนมากยังเก็บวินาที การส่งค่าวินาทีเข้า Date โดยตรงจึงเป็นบั๊กที่พบบ่อย:

const unixSeconds = 1720000000;

const wrong = new Date(unixSeconds);
const correct = new Date(unixSeconds * 1000);

wrong อยู่ใกล้ 1970 (1970-01-20 21:46:40 UTC) correct คือช่วงเวลาสมัยใหม่ (2024-07-03 09:46:40 UTC)

ระบบอื่นอาจใช้หน่วยต่างกัน

ภาษา API และฐานข้อมูลอื่นอาจใช้วินาทีหรือมิลลิวินาที บางระบบเก็บไมโครวินาทีหรือนาโนวินาที อย่าสมมติว่าภาษาหนึ่งใช้หน่วยเดียวเสมอ—ดูเอกสาร ถ้าตัวเลขอยู่ใน JSON จัดรูปแบบและเปรียบเทียบ JSON ช่วยให้อ่านฟิลด์ง่ายขึ้น แต่ยังไม่บอกหน่วย

จะรู้ได้อย่างไรว่า timestamp ใช้หน่วยอะไร

ตรวจตามลำดับนี้ จำนวนหลักอย่างเดียวไม่พอ

  1. ดูเอกสาร API หรือฐานข้อมูล
  2. ดูจำนวนหลักโดยประมาณ
  3. เทียบค่ากับ timestamp ยุคใหม่ที่สมเหตุสมผล
  4. ลองตีความเป็นวินาทีและมิลลิวินาที
  5. ดูว่าวันที่ที่ได้สมเหตุสมผลหรือไม่

ถ้าการตีความหนึ่งได้ 1970 อีกแบบได้วันที่ที่คุณจำได้ สาเหตุคือหน่วยไม่ตรงกัน

ความผิดพลาด Unix timestamp ที่พบบ่อย

  • อ่านวินาทีเป็นมิลลิวินาที วันที่ยุบเข้าหา 1970 เหมือนตัวอย่างด้านบน
  • อ่านมิลลิวินาทีเป็นวินาที วันที่กระโดดไกลไปอนาคต หรือแปลงไม่สำเร็จ
  • คูณ 1,000 สองครั้ง ค่าที่เป็นมิลลิวินาทีอยู่แล้วจะใหญ่โต วันที่เลื่อนไปหลายศตวรรษ
  • หาร 1,000 สองครั้ง ค่าวินาทีหดอีกครั้ง กลับไปใกล้ 1970
  • โทษเขตเวลา เขตเวลาเลื่อนชั่วโมงหรือวันตามปฏิทินได้ แต่ไม่ทำให้ timestamp ยุคใหม่กลายเป็น 1970
  • ถือสตริงวันที่ที่จัดรูปแบบแล้วเป็น Unix timestamp ค่าอย่าง 2024-07-03T09:46:40Z ไม่ใช่ตัวเลข epoch ให้แยกวิเคราะห์เป็นสตริงวันที่ ไม่ใช่วินาที

เขตเวลาทำให้เกิดปัญหา 1970 หรือ

โดยปกติไม่ใช่ เขตเวลาเปลี่ยนนาฬิกาที่แสดง และใกล้เที่ยงคืนอาจเปลี่ยนวันที่ตามปฏิทินได้ แต่ไม่เปลี่ยน Unix timestamp ยุคใหม่ให้เป็น 1970 ถ้าผลเป็น 1970 ให้ตรวจวินาทีกับมิลลิวินาทีก่อน

แปลงและตรวจ Unix timestamp

NEXNARA ตัวแปลงวันที่และเวลา แปลง Unix timestamp ในเบราว์เซอร์ได้

วางวินาทีหรือมิลลิวินาที Unix ใช้ timestamp ปัจจุบัน ดู UTC กับเวลาท้องถิ่น แปลงเขตเวลา และจัดรูปแบบวันที่ การตรวจจับอัตโนมัติมักถือ 10 หลักเป็นวินาที และ 13 หลักเป็นมิลลิวินาที คุณยังเลือกหน่วยเองได้

การแปลงเกิดขึ้นในเบราว์เซอร์ เครื่องมือนี้ไม่ส่งวันที่หรือ timestamp ไปเซิร์ฟเวอร์ NEXNARA โฆษณาและฟีเจอร์อื่นของไซต์ยังใช้เครือข่าย ซึ่งแยกจากการแปลง

อยากตรวจ Unix timestamp เปิด ตัวแปลงวันที่และเวลา แล้วเทียบวินาทีกับมิลลิวินาที

FAQ

ทำไม Unix timestamp ของฉันขึ้น 1970

มักเป็นวินาทีที่อ่านเป็นมิลลิวินาที JavaScript จัดการตัวเลขที่เล็กกว่ามาก วันที่จึงอยู่หลัง 1970-01-01 00:00:00 UTC ไม่นาน คูณวินาทีด้วย 1,000 แล้วแปลงอีกครั้ง

Unix timestamp เป็นวินาทีหรือมิลลิวินาที

มักเป็นวินาที API เว็บและ Date ใน JavaScript จำนวนมากใช้มิลลิวินาที ดูเอกสารของระบบนั้น บางระบบใช้ไมโครวินาทีหรือนาโนวินาที

แปลงวินาทีเป็นมิลลิวินาทีอย่างไร

คูณ 1,000 1720000000 วินาทีเท่ากับ 1720000000000 มิลลิวินาที ทางกลับหารด้วย 1,000

ทำไม Date ใน JavaScript ใช้มิลลิวินาที

timestamp ตัวเลขของ Date ใน JavaScript นิยามเป็นมิลลิวินาทีนับจาก Unix epoch จึงทำให้ new Date(unixSeconds) ผิดเมื่อ unixSeconds เป็นวินาที Unix

timestamp 10 หลักเป็นวินาทีเสมอหรือ

ไม่ใช่ สำหรับวันที่ยุคใหม่มักใช่ และ 13 หลักมักเป็นมิลลิวินาที จำนวนหลักเป็นเบาะแส ไม่ใช่กฎ ให้ยืนยันด้วยเอกสารหรือวันที่ที่สมเหตุสมผล

Unix timestamp มีเขตเวลาไหม

ไม่มี Unix timestamp คือช่วงเวลาหนึ่งนับจาก 1970-01-01 00:00:00 UTC เขตเวลามีผลกับการแสดงผล ไม่ใช่ตัวเลขเอง