2010-01-06 56 views
326

Làm thế nào để có được ngày hiện tại trong Java?Tương đương với DateTime.Now của C# trong Java?

Trong C# nó là DateTime.Now.

+0

Câu hỏi này cũ hơn [Câu hỏi này] (http://stackoverflow.com/q/5175728/642706) trước đây được đánh dấu là trùng lặp. Vì vậy, tôi đảo ngược tên gọi, mở lại Câu hỏi này và đánh dấu câu hỏi mới hơn là bản sao. –

+1

Tiêu đề trong "trùng lặp" rõ ràng hơn và được tìm thấy dễ dàng hơn thông qua Tìm kiếm của Google – ragerdl

Trả lời

402

Chỉ cần tạo đối tượng Date mới mà không có bất kỳ đối số nào; điều này sẽ gán ngày giờ hiện tại cho đối tượng mới.

import java.util.Date; 

Date d = new Date(); 

Trong những lời của the Javadocs cho the zero-argument constructor:

Phân bổ một đối tượng Date và khởi nó để nó đại diện cho thời gian mà tại đó nó được phân bổ, được đo trong vòng miligiâ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 - sau này không có một constructor zero-arg, và có ngữ nghĩa hơi khác nhau mà là chủ đề của một cuộc trò chuyện hoàn toàn khác nhau. :)

+13

Cũng lưu ý rằng GregorianCalendar 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ỳ kiểu đối tượng ngày/lịch nào bạn đang làm việc, hàm tạo không đối số thường khởi tạo đối tượng cho ngày/giờ hiện tại. –

+0

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 trường ngày và giờ và lớp DateFormat nên được sử dụng để định dạng và phân tích chuỗi ngày tháng. –

+8

Hãy xem xét các API Java8 mới - [LocalDateTime.now() và ZonedDateTime.now()] (http://stackoverflow.com/a/26225884/513342) –

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

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

+0

Đã thêm "mới" để sửa lỗi. –

5

Nếu bạn tạo một đối tượng Date mới, theo mặc định nó sẽ được thiết lập đến thời điểm hiện tại:

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

Java DateCalendar lớp học được nhiều người xem đượ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 có sẵn trong Java.

Tương đương DateTime.Now trong Joda Thời gian là:

DateTime dt = new DateTime(); 

Cập nhật

Như đã đề cập trong các ý kiến, các phiên bản mới nhất của Joda Thời gian có một DateTime.now() phương pháp, vì vậy:

DateTime dt = DateTime.now(); 
+4

Phiên bản hiện tại (2.1) của Joda dường như có một phương thức DateTime.now tĩnh() (tùy ý chấp nhận DateTimeZone hoặc Chronology). http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html#now%28%29 –

+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] (https://docs.oracle.com/javase/tutorial/datetime/index.html) và nhiều bài viết trực tuyến khác để biết thêm thông tin. – DavidS

10

java.lang.System.currentTimeMillis(); sẽ trả về ngày giờ kể từ ngày kỷ nguyên

+0

Tốt để ghi nhật ký 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 –

6
import org.joda.time.DateTime; 

DateTime now = DateTime.now(); 
13

Trong Java 8 đó là:

ZonedDateTime dateTime = ZonedDateTime.now(); 
27

tl; dr

Instant.now() 

java.thời gian

Lớp java.util.Date đã bị lỗi thời bởi java.time package (Tutorial) mới trong Java 8 trở lên. Các lớp java.util.Date/.Calendar cũ nổi tiếng phiền hà, 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 đóng gói:

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

Nếu không xác định múi giờ, múi giờ mặc định hiện tại của JVM của bạn được chỉ định âm thầm. Tốt hơn để xác định múi giờ mong muốn/mong đợi 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ó được thói quen làm việc của bạn back-end (logic kinh doanh, cơ sở dữ liệu, lưu trữ, trao đổi dữ liệu) tất cả trong UTC múi giờ. Mã ở trên dựa hoàn toàn vào múi giờ mặc định hiện tại của JVM.

Lớp Instant đại diện cho một thời điểm trong dòng thời gian ở UTC với độ phân giải nano giây.

Instant instant = Instant.now(); 

Lớp Instant là lớp xây dựng 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, hãy chuyển đổi thành OffsetDateTime. Chỉ định đối tượng ZoneOffset. Đối với UTC, hãy sử dụng tiện ích constant for UTC.

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

Time Zone

Quý khách dễ dàng thích nghi với múi giờ khác để trình bày cho người dùng. Sử dụng proper time zone name, 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 biểu diễn chuỗi của giá trị ngày giờ đó, đượ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 đối tượng Instant đại diện cho một thời điểm trên dòng thời gian, đến độ phân giải nano giây, luôn ở dạng UTC. Điều này cung cấp khối xây dựng cho một ngày giờ được khoanh vùng, cùng với việc gán múi giờ.Bạn có thể nghĩ về nó khái niệm theo cách này:

ZonedDateTime = Instant + ZoneId

Bạn có thể trích xuất một Instant từ một ZonedDateTime.

Instant instantNow = zdt.toInstant(); 

Bạn có thể bắt đầu với Instant. Không cần chỉ định múi giờ tại đây, vì Instant luôn ở dạng UTC.

Instant now = Instant.now(); 
+0

Tôi cũng đã đăng [câu trả lời khác] (http://stackoverflow.com/a/39379431/642706) với nhiều chi tiết hơn về Câu hỏi trùng lặp. –

2

Java luôn nhận được 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ó (chẳng hạn như java.util.DateSimpleDateFormatter) không an toàn với chuỗi có thể dẫn đến các vấn đề tương tranh. Ngoài ra còn có một số lỗi trong API. Ví dụ: năm trong số java.util.Date bắt đầu vào năm 1900, tháng bắt đầu lúc 1 và ngày bắt đầu từ 0 — không bắt đầu trực quan. Những vấn đề này đã dẫn đến sự phổ biến của thư viện ngày và giờ của bên thứ ba, chẳng hạn như Joda-Time. Để giải quyết một ngày mới và thời gian API được thiết kế cho Java SE 8.

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

Theo doc:

Phương pháp now() trả về hiện ngày thời gian sử dụng hệ thống đồng hồ và thời gian mặc định -zone, không rỗng. Nó có được ngày giờ 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 ngày giờ hiện tại. Sử dụng phương pháp này sẽ ngăn chặn khả năng sử dụng một đồng hồ thay thế để thử nghiệm vì đồng hồ được mã hóa cứng.

Các vấn đề liên quan