รับ“ unixtime” ใน Java


258

Date.getTime () ส่งคืนมิลลิวินาทีตั้งแต่วันที่ 1 มกราคม 1970 Unixtime คือวินาทีตั้งแต่วันที่ 1 มกราคม 1970 ฉันมักจะไม่ใช้โค้ดในจาวา แต่ฉันทำงานกับการแก้ไขข้อบกพร่องบางอย่าง ฉันมี:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

มีวิธีที่ดีกว่าที่จะใช้ unixtime ใน java หรือไม่?


27
เมื่อคุณส่งไปยัง int คุณได้เปิดตัวปัญหาปี 2038 (เทียบเท่า Y2K สำหรับ Unix) นั่นคือเมื่อยุคที่ Unix ได้รับความนิยมสูงถึง 2 พันล้านเหรียญ การแก้ไขคือการย้ายไปยัง Unix 64 บิต ค่าเทียบเท่าของ Java คือการปล่อยให้มันยาว
John M

1
ใช่ฉันรู้แล้ว รหัสนี้กำลังเชื่อมต่อกับที่คาดว่าจะเป็น 32 บิต int สำหรับ unixtime
Gary Richardson

157
2038 เร็ว ๆ นี้
Pacerier

มีชื่อหรือมาตรฐานที่เหมาะสมสำหรับ currentTimeMillis หรือไม่? ฉันมักจะอ้างถึงในเอกสารประกอบของฉันว่าเป็นเวลา UNIX เวอร์ชันมิลลิวินาที
Tom

1
หากคุณต้องการซอฟต์แวร์ของคุณจะอยู่รอดล้นใช้งานไม่ได้long intไม่มีเหตุผลที่จะใช้intสำหรับการประทับเวลาเว้นแต่ว่าคุณกำลังใช้ความละเอียดที่แตกต่างกันเช่น 1 วินาที = 4 วินาที ฯลฯ ไม่ว่าจะเป็นหรือซ่อนรหัสของคุณเพื่อให้คนรุ่นต่อไปในอนาคตไม่สามารถเห็นว่าคุณไร้ความสามารถอย่างไร
bryc

คำตอบ:


475

หลีกเลี่ยงการสร้างวัตถุวันที่ w / System.currentTimeMillis () การหารด้วย 1,000 จะทำให้คุณเข้าสู่ยุค Unix

ตามที่กล่าวไว้ในความคิดเห็นโดยทั่วไปคุณต้องการความยาวดั้งเดิม (ตัวพิมพ์เล็ก - ใหญ่ - ยาว) ไม่ใช่วัตถุชนิดบรรจุกล่อง (ยาว - ตัวพิมพ์ใหญ่ - ยาว) สำหรับชนิดของตัวแปร unixTime

long unixTime = System.currentTimeMillis() / 1000L;

3
นอกจากนี้ยังพิจารณาการใช้ดั้งเดิมยาวแทน Autoboxing ไปลองถ้าคุณต้องการที่จะจัดการกับตัวเลขเป็นวัตถุ (เช่นใส่ลงในคอลเลกชัน) อีกครั้งเพื่อหลีกเลี่ยงการสร้างวัตถุที่ไม่จำเป็น
brabster

9
Java 32- บิต int ตรงกับแพลตฟอร์ม 32- บิต (และปัญหาปี 2038) แพลตฟอร์ม 64 บิตใช้ชนิดข้อมูล time_t ที่ใหญ่ขึ้น Java หลบกระสุนนั้นโดยใช้ตราบใดที่การส่งคืนสำหรับ System.currentTimeMillis () หากคุณแปลงเป็น int คุณจะแนะนำปัญหาปี 2038 อีกครั้ง ดูen.wikipedia.org/wiki/Year_2038_problem#Solutions
John M

1
ฉันคิดว่าคุณเข้าใจผิดในจุดหนึ่ง: ไม่มีความแตกต่างระหว่างตัวพิมพ์เล็ก "L" และตัวพิมพ์ใหญ่เมื่อใช้งานเป็นตัวอักษรตัวเลขเช่นนี้ docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
matt forsythe

5
การอภิปรายตัวพิมพ์ใหญ่ (ชี้แจงด้านบน) เป็นเรื่องเกี่ยวกับประเภทข้อมูล ดั้งเดิมของอินสแตนซ์ของคลาส "long" vs "java.lang.Long" คุณกำลังพูดถึงตัวอักษรต่อท้ายในตัวอักษรยาวซึ่งฉันเห็นด้วยอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก แม้ว่าตัวพิมพ์เล็ก "l" จะดูเป็นจำนวนมากเหมือนหลัก "1" ดังนั้นจึงสามารถอ่านได้ง่ายกว่าการใช้ตัวพิมพ์ใหญ่ "L"
John M

1
คลิกที่ลิงค์ไปยังเอกสารประกอบ การส่งคืนถูกกำหนดเป็นจำนวนมิลลิวินาทีตั้งแต่ 1/1/1970 ในเขตเวลา UTC คุณต้องการเขตเวลาหรือไม่ ดูที่ java.util.Calendar
John M

273

Java 8 เพิ่ม API ใหม่สำหรับการทำงานกับวันที่และเวลา ด้วย Java 8 คุณสามารถใช้

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()ส่งคืนInstantซึ่งแสดงเวลาระบบปัจจุบัน ด้วยgetEpochSecond()คุณจะได้รับวินาทียุค (เวลายูนิกซ์) Instantจาก


4
อะไรคือความแตกต่างระหว่างInstant.now().getEpochSecond(), new Date().getTime()และSystem.currentTimeMillis()
SohamC

2
สิ่งหนึ่งที่แตกต่างคือการที่อดีตอยู่ในไม่กี่วินาทีในขณะที่สองหลังอยู่ในหน่วยมิลลิวินาที อาจมีหรือไม่มีคนอื่น
super_aardvark

3
import java.time.Instantถ้าคุณอยู่ใน Scala
akauppi

4
ตรวจสอบเว็บไซต์นี้เช่นกันสำหรับคำอธิบายรายละเอียด ... ชอบ .. ปัจจุบัน
เวลามิลลิส

1
โปรดทราบว่าคุณไม่สามารถใช้วิธีนี้กับ Android API ระดับเก่ากว่า
Ali Nadalizadeh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.