Làm cách nào để có được ngày và giờ hiện tại trong Java?
Tôi đang tìm kiếm một cái gì đó tương đương với DateTime.Now
từ C #.
Làm cách nào để có được ngày và giờ hiện tại trong Java?
Tôi đang tìm kiếm một cái gì đó tương đương với DateTime.Now
từ C #.
Câu trả lời:
Chỉ cần xây dựng một Date
đối tượng mới mà không có bất kỳ đối số; điều này sẽ chỉ định ngày giờ hiện tại cho đối tượng mới.
import java.util.Date;
Date d = new Date();
Theo lời của Javadocs cho hàm tạo không có đối số :
Phân bổ một đối tượng Date và khởi tạo nó để nó đại diện cho thời gian mà nó được phân bổ , được đo đến mili giây gần nhất.
Hãy chắc chắn rằng bạn đang sử dụng java.util.Date
và không java.sql.Date
- phần sau không có hàm tạo zero-arg và có một số ngữ nghĩa hơi khác nhau, là chủ đề của một cuộc trò chuyện hoàn toàn khác. :)
Các lớp Ngày và Lịch Java được nhiều người coi là được thiết kế kém. Bạn nên xem Joda Time , một thư viện thường được sử dụng thay cho các thư viện ngày dựng sẵn của Java.
Tương đương với DateTime.Now
trong Joda Time là:
DateTime dt = new DateTime();
Cập nhật
Như đã lưu ý trong các nhận xét, các phiên bản mới nhất của Joda Time có một DateTime.now()
phương pháp, vì vậy:
DateTime dt = DateTime.now();
Instant.now()
Lớp java.util.Date đã bị lỗi thời bởi gói java.time ( Hướng dẫn ) mới trong Java 8 trở lên. Các lớp java.util.Date/.CalWiki cũ nổi tiếng là rắc rối, khó hiểu và thiếu sót. Tránh chúng.
ZonedDateTime
Lấy thời điểm hiện tại trong java.time.
ZonedDateTime now = ZonedDateTime.now();
Một ZonedDateTime
gói gọn:
Nếu không có múi giờ được chỉ định, múi giờ mặc định hiện tại của JVM của bạn sẽ được chỉ định âm thầm. Tốt hơn để xác định múi giờ mong muốn / mong muốn của bạn hơn là dựa hoàn toàn vào mặc định.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );
Nói chung tốt hơn để có thói quen thực hiện công việc back-end của bạn (logic nghiệp vụ, cơ sở dữ liệu, lưu trữ, trao đổi dữ liệu) tất cả trong múi giờ UTC . Đoạn mã trên dựa hoàn toàn vào múi giờ mặc định hiện tại của JVM.
Các Instant
lớp đại diện cho một thời điểm trong thời gian ở UTC với độ phân giải nano giây.
Instant instant = Instant.now();
Các Instant
lớp là một lớp xây dựng khối cơ bản trong java.time và có thể được sử dụng thường xuyên trong mã của bạn.
Khi bạn cần linh hoạt hơn trong định dạng, chuyển đổi thành một OffsetDateTime
. Chỉ định một ZoneOffset
đối tượng. Đối với UTC sử dụng hằng số tiện dụng cho UTC .
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
Bạn dễ dàng điều chỉnh sang múi giờ khác để trình bày cho người dùng. Sử dụng tên múi giờ thích hợp , không bao giờ mã 3-4 chữ cái như EST
hoặc IST
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );
Tạo một đại diện Chuỗi của giá trị thời gian ngày đó, được bản địa hóa.
String output = DateTimeFormatter
.ofLocalizedDate( FormatStyle.FULL )
.withLocale( Locale.CANADA_FRENCH )
.format ( nowMontreal );
Instant
Hoặc, để ở lại UTC, sử dụng Instant
. Một Instant
đối tượng biểu thị một khoảnh khắc trên dòng thời gian, đến độ phân giải nano giây, luôn ở UTC. Điều này cung cấp khối xây dựng cho thời gian ngày được khoanh vùng, cùng với việc gán múi giờ. Bạn có thể nghĩ về nó theo khái niệm theo cách này:
Bạn có thể trích xuất một Instant
từ ZonedDateTime
.
Instant instantNow = zdt.toInstant();
Bạn có thể bắt đầu với một Instant. Không cần chỉ định múi giờ ở đây, như Instant
luôn có trong UTC.
Instant now = Instant.now();
Tôi thích sử dụng đối tượng Lịch.
Calendar now = GregorianCalendar.getInstance()
Tôi thấy nó dễ dàng hơn để làm việc với. Bạn cũng có thể nhận được một đối tượng Ngày từ Lịch.
http://java.sun.com/javase/6/docs/api/java/util/GregorianCalWiki.html
Calendar.getInstance()
Trong Java 8, nó:
ZonedDateTime dateTime = ZonedDateTime.now();
java.lang.System.currentTimeMillis();
sẽ trả về datetime kể từ kỷ nguyên
Java luôn có sự hỗ trợ không đầy đủ cho các trường hợp sử dụng ngày và giờ. Ví dụ, các lớp hiện có (như java.util.Date
và SimpleDateFormatter
) không an toàn luồng có thể dẫn đến các vấn đề tương tranh. Ngoài ra có một số sai sót nhất định trong API. Ví dụ: năm java.util.Date
bắt đầu từ 1900, tháng bắt đầu từ 1 và ngày bắt đầu từ 0F không trực quan lắm. Những vấn đề này dẫn đến sự phổ biến của các thư viện ngày và thời gian của bên thứ ba, chẳng hạn như Joda-Time
. Để giải quyết API ngày và giờ mới được thiết kế cho Java SE 8.
LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);
Theo tài liệu :
Phương thức
now()
trả về thời gian ngày hiện tại bằng cách sử dụng đồng hồ hệ thống và múi giờ mặc định, không phải là null . Nó có được thời gian ngày hiện tại từ đồng hồ hệ thống trong múi giờ mặc định. Điều này sẽ truy vấn đồng hồ hệ thống trong múi giờ mặc định để có được thời gian ngày hiện tại. Sử dụng phương pháp này sẽ ngăn khả năng sử dụng đồng hồ thay thế để thử nghiệm vì đồng hồ được mã hóa cứng.