Làm thế nào để có được ngày giờ hiện tại


342

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.Nowtừ C #.


Câu hỏi này cũ hơn Câu hỏi này trước đây được đánh dấu là trùng lặp. Vì vậy, tôi đã đảo ngược chỉ định, mở lại Câu hỏi này và đánh dấu câu hỏi mới hơn là trùng lặp.
Basil Bourque

Câu trả lời:


414

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.Datevà 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. :)


13
Cũng lưu ý rằng GregorianCalWiki và nhiều đối tượng tương tự hoạt động theo cùng một cách. Vì vậy, bất kể loại đối tượng ngày / lịch nào bạn đang làm việc, hàm tạo đối số zero thường khởi tạo đối tượng theo ngày / giờ hiện tại.
Peter Di Cecco

Từ tài liệu ngày: Kể từ JDK 1.1, lớp Lịch nên được sử dụng để chuyển đổi giữa các ngày và trường thời gian và lớp DateFormat nên được sử dụng để định dạng và phân tích chuỗi ngày.
Paolo M

9
Vui lòng xem xét các API Java8 mới - LocalDateTime.now () và ZencedDateTime.now ()
Oleg Mikheev

59

Các lớp NgàyLị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.Nowtrong 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();

4
Phiên bản (2.1) hiện tại của Joda dường như có phương thức DateTime.now () (tùy chọn chấp nhận DateTimeZone hoặc Chronology). joda-time.sourceforge.net/apidocs/org/joda/time/ từ
Roman A.

1
Lưu ý rằng câu trả lời này đã được đăng vào năm 2010. Java 8 đã hấp thụ nhiều tính năng tốt nhất của Joda Time. Xem tài liệu chính thức và nhiều bài viết trực tuyến khác để biết thêm thông tin.
DavidS 2/2/2016

36

tl; dr

Instant.now()

java.time

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 ZonedDateTimegói gọn:

  • Ngày.
  • Thời gian trong ngày, với độ phân giải từ giây đến nano giây .
  • Múi giờ.

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 );

UTC

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 Instantlớ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 Instantlớ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 );

Múi giờ

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ư ESThoặ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:

ZonedDateTime= Instant+ZoneId

Bạn có thể trích xuất một Instanttừ 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ư Instantluôn có trong UTC.

Instant now = Instant.now();

Tôi cũng đăng một câu trả lời khác với nhiều chi tiết hơn về một Câu hỏi trùng lặp.
Basil Bourque



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

Lưu ý rằng đối tượng Date có thể thay đổi và nếu bạn muốn làm bất cứ điều gì tinh vi, hãy sử dụng jodatime .


10

java.lang.System.currentTimeMillis(); sẽ trả về datetime kể từ kỷ nguyên


Tốt để đăng nhập nhưng yêu cầu phân tích cú pháp và chuyển đổi để hiển thị cho người dùng
Rishi Dua

6
import org.joda.time.DateTime;

DateTime now = DateTime.now();

5

Nếu bạn tạo một đối tượng Ngày mới, theo mặc định, nó sẽ được đặt thành thời gian hiện tại:

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

3

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.DateSimpleDateFormatter) 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.Datebắ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.