วิธีรับวันที่และเวลาปัจจุบัน


342

ฉันจะรับวันที่และเวลาปัจจุบันใน Java ได้อย่างไร

ฉันกำลังมองหาบางอย่างที่เทียบเท่ากับDateTime.NowC #


คำถามนี้เก่ากว่าคำถามนี้ที่ทำเครื่องหมายว่าซ้ำซ้อน ดังนั้นฉันจึงกลับการกำหนดให้เปิดคำถามนี้อีกครั้งและทำเครื่องหมายคำถามที่ใหม่กว่าเป็นสำเนา
Basil Bourque

คำตอบ:


414

เพียงสร้างDateวัตถุใหม่โดยไม่มีข้อโต้แย้งใด ๆ สิ่งนี้จะกำหนดวันที่และเวลาปัจจุบันให้กับวัตถุใหม่

import java.util.Date;

Date d = new Date();

ในคำพูดของJavadocsสำหรับตัวสร้างศูนย์อาร์กิวเมนต์ :

จัดสรรวัตถุวันที่และเริ่มต้นมันเพื่อที่จะแสดงเวลาที่มันได้รับการจัดสรรวัดเป็นมิลลิวินาทีที่ใกล้ที่สุด

ตรวจสอบให้แน่ใจว่าคุณใช้อยู่java.util.Dateและไม่ใช่java.sql.Date- ตัวหลังไม่มีตัวสร้าง zero-arg และมีซีแมนทิกส์ที่แตกต่างกันบ้างซึ่งเป็นหัวข้อของการสนทนาที่แตกต่างกันโดยสิ้นเชิง :)


13
โปรดทราบว่า GregorianCalendar และวัตถุที่คล้ายกันจำนวนมากทำงานในลักษณะเดียวกัน ดังนั้นชนิดของวัตถุวันที่ / ปฏิทินที่คุณทำงานด้วยตัวสร้าง zero-argument มักจะเริ่มต้นวัตถุเป็นวันที่ / เวลาปัจจุบัน
Peter Di Cecco

จาก Date doc: ตั้งแต่ JDK 1.1 คลาส Calendar ควรใช้ในการแปลงระหว่างวันที่และเวลาและคลาส DateFormat ควรใช้ในการจัดรูปแบบและแยกสตริงวันที่
เปาโล M

9
โปรดพิจารณา API ของ Java8 ใหม่ - LocalDateTime.now () และ ZonedDateTime.now ()
Oleg Mikheev

59

คลาสJava DateและCalendarได้รับการพิจารณาจากหลาย ๆ คนว่าไม่ถูกต้อง คุณควรดูJoda Timeซึ่งเป็นไลบรารีที่ใช้กันโดยทั่วไปแทนการใช้ไลบรารีวันที่ในตัวของ Java

สิ่งที่เทียบเท่าDateTime.Nowใน Joda Time คือ:

DateTime dt = new DateTime();

ปรับปรุง

ตามที่ระบุไว้ในความคิดเห็นเวอร์ชันล่าสุดของ Joda Time มีDateTime.now()วิธีการดังนี้:

DateTime dt = DateTime.now();

4
ดูเหมือนว่ารุ่น Joda ปัจจุบัน (2.1) จะมีวิธี DateTime.now แบบคงที่ () (ยอมรับทางเลือก DateTimeZone หรือลำดับเหตุการณ์) joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher

1
โปรดทราบว่าคำตอบนี้ถูกโพสต์ในปี 2010 Java 8 ได้ดูดซับคุณสมบัติที่ดีที่สุดของ Joda Time ไว้มากมาย ดูเอกสารอย่างเป็นทางการและบทความออนไลน์อื่น ๆ อีกมากมายสำหรับข้อมูลเพิ่มเติม
DavidS

36

TL; DR

Instant.now()

java.time

คลาส java.util.Date ได้รับการoutmoded โดยแพคเกจ java.timeใหม่( Tutorial ) ใน Java 8 และใหม่กว่า คลาส java.util.Date/.Calendar เก่า ๆ มีปัญหายุ่งยากสับสนและมีข้อบกพร่อง หลีกเลี่ยงพวกเขา

ZonedDateTime

รับช่วงเวลาปัจจุบันเป็น java.time

ZonedDateTime now = ZonedDateTime.now();

ZonedDateTimeสุนทรีย์:

หากไม่ได้ระบุเขตเวลาไว้เขตเวลาเริ่มต้นปัจจุบันของ JVM ของคุณจะถูกกำหนดอย่างเงียบ ๆ ดีกว่าที่จะระบุโซนเวลาที่คุณต้องการ / คาดว่าจะดีกว่าพึ่งพาปริยายโดยปริยาย

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

โดยทั่วไปจะดีกว่าหากคุณมีนิสัยชอบทำงานแบ็คเอนด์ (ตรรกะทางธุรกิจฐานข้อมูลการจัดเก็บการแลกเปลี่ยนข้อมูล) ในเขตเวลาUTC รหัสข้างต้นอาศัยนัยในโซนเวลาเริ่มต้นปัจจุบันของ JVM

Instantชั้นหมายถึงช่วงเวลาในระยะเวลาเวลา UTC กับความละเอียดของนาโนวินาที

Instant instant = Instant.now();

Instantชั้นเป็นชั้นอาคารบล็อกพื้นฐานใน java.time และอาจจะใช้บ่อยในรหัสของคุณ

OffsetDateTimeเมื่อคุณต้องการความยืดหยุ่นมากขึ้นในการจัดรูปแบบแปลงเป็น ระบุZoneOffsetวัตถุ สำหรับ UTC ใช้ประโยชน์อย่างต่อเนื่องสำหรับ UTC

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

เขตเวลา

คุณสามารถปรับเป็นโซนเวลาอื่นสำหรับการนำเสนอต่อผู้ใช้ ใช้ชื่อโซนเวลาที่เหมาะสม , ไม่เคย 3-4 รหัสตัวอักษรเช่นหรือESTIST

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );

สร้างการเป็นตัวแทนสตริงของค่าวันที่และเวลาที่มีการแปล

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

หรือจะอยู่ใน UTC Instantใช้ Instantวัตถุหมายถึงช่วงเวลาในระยะเวลาที่จะมีมติ nanosecond เสมอในเวลา UTC สิ่งนี้แสดง Building Block สำหรับวันที่กำหนดเวลารวมถึงการกำหนดเขตเวลา คุณสามารถคิดได้ด้วยวิธีนี้:

ZonedDateTime= Instant+ZoneId

คุณสามารถแยกจากInstantZonedDateTime

Instant instantNow = zdt.toInstant();

คุณสามารถเริ่มต้นได้ทันที ไม่จำเป็นต้องระบุเขตเวลาที่นี่เช่นเดียวกับInstantใน UTC

Instant now = Instant.now();

ฉันยังโพสต์คำตอบอื่นพร้อมรายละเอียดเพิ่มเติมเกี่ยวกับคำถามที่ซ้ำกัน
Basil Bourque

16

ฉันชอบที่จะใช้วัตถุปฏิทิน

Calendar now = GregorianCalendar.getInstance()

ฉันพบว่าการทำงานกับมันง่ายกว่ามาก นอกจากนี้คุณยังสามารถรับวัตถุวันที่จากปฏิทิน

http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html


4
หรืออาจเป็นเพียงCalendar.getInstance()
วาด



10

java.lang.System.currentTimeMillis(); จะคืนค่าวันที่และเวลาตั้งแต่ยุค


ดีสำหรับการบันทึก แต่ต้องมีการแยกวิเคราะห์และการแปลงเพื่อแสดงต่อผู้ใช้
Rishi Dua


5

หากคุณสร้างวัตถุ Date ใหม่โดยค่าเริ่มต้นวัตถุจะถูกตั้งค่าเป็นเวลาปัจจุบัน:

import java.util.Date;
Date now = new Date();

3

Java ได้รับการสนับสนุนที่ไม่เพียงพอสำหรับกรณีการใช้วันที่และเวลา ตัวอย่างเช่นคลาสที่มีอยู่ (เช่นjava.util.DateและSimpleDateFormatter) ไม่ปลอดภัยสำหรับเธรดซึ่งอาจนำไปสู่ปัญหาการเกิดพร้อมกัน นอกจากนี้ยังมีข้อบกพร่องบางอย่างใน API ตัวอย่างเช่นปีที่java.util.Dateเริ่มต้นที่ 1900 เดือนเริ่มต้นที่ 1 และวันเริ่มต้นที่ 0 - ไม่ง่ายมาก Joda-Timeปัญหาเหล่านี้จะนำไปสู่ความนิยมของวันที่และเวลาของบุคคลที่สามห้องสมุดเช่น เพื่อระบุวันที่และเวลาใหม่ API ได้รับการออกแบบสำหรับ Java SE 8

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

ตามเอกสาร :

วิธีการที่now()จะส่งกลับวันเวลาปัจจุบันโดยใช้นาฬิการะบบและเริ่มต้นโซนเวลาไม่เป็นโมฆะ มันได้รับวันที่เวลาปัจจุบันจากนาฬิกาของระบบในเขตเวลาเริ่มต้น สิ่งนี้จะทำการสืบค้นนาฬิกาของระบบในเขตเวลาเริ่มต้นเพื่อรับวันที่ปัจจุบัน การใช้วิธีนี้จะป้องกันความสามารถในการใช้นาฬิกาสำรองสำหรับการทดสอบเนื่องจากนาฬิกามีการเข้ารหัสยาก

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