Làm cách nào để có dấu thời gian hiện tại ở định dạng chuỗi trong Java? Yyyy.MM.dd.HH.mm.ss


174

Làm cách nào để có dấu thời gian ở định dạng chuỗi trong Java? "yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

Đây là những gì tôi có, nhưng Dấu thời gian () yêu cầu tham số ...


yetStatement.setTimestamp (1, Dấu thời gian mới (System.civerseTimeMillis ()));
Rajat

lỗi gì bạn nhận được?
Robert Columbia

FYI, các lớp thời gian cũ rắc rối khủng khiếp như SimpleDateFormatjava.sql.Timestamphiện đang là di sản , được thay thế bởi các lớp java.time được xây dựng trong Java 8 trở lên. Xem Hướng dẫn của Oracle .
Basil Bourque

Câu trả lời:


202

Thay thế

new Timestamp();

với

new java.util.Date()

bởi vì không có hàm tạo mặc định cho Timestamphoặc bạn có thể làm điều đó với phương thức:

new Timestamp(System.currentTimeMillis());

5
FYI, các lớp thời gian cũ rắc rối khủng khiếp như java.util.Datejava.sql.Timestamphiện đang là di sản , được thay thế bởi các lớp java.time được xây dựng trong Java 8 trở lên. Xem Hướng dẫn của Oracle .
Basil Bourque

160

Sử dụng java.util.Datelớp thay vì Dấu thời gian.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Điều này sẽ giúp bạn có được ngày hiện tại trong định dạng được chỉ định.


5
Điều này đã giúp tôi ra ngoài và tôi đã thực hiện một số thay đổi để tôi không phải nhập khẩu new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni

Tốt hơn new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon

36

tl; dr

Chỉ sử dụng các lớp java.time hiện đại . Không bao giờ sử dụng các lớp học di sản khủng khiếp như SimpleDateFormat, Datehoặc java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Hoặc sử dụng múi giờ mặc định hiện tại của JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time & JDBC 4.2

Cách tiếp cận hiện đại sử dụng các lớp java.time như đã thấy ở trên.

Nếu trình điều khiển JDBC của bạn tuân thủ JDBC 4.2 , bạn có thể trao đổi trực tiếp các đối tượng java.time với cơ sở dữ liệu. Sử dụng PreparedStatement::setObjectResultSet::getObject.

Chỉ sử dụng java.sql cho trình điều khiển trước JDBC 4.2

Nếu trình điều khiển JDBC của bạn chưa tuân thủ JDBC 4.2 để hỗ trợ các loại java.time , bạn phải quay lại sử dụng các lớp java.sql.

Lưu trữ dữ liệu.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Lấy dữ liệu.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Các loại java.sql, chẳng hạn như java.sql.Timestamp, chỉ nên được sử dụng để chuyển vào và ra khỏi cơ sở dữ liệu. Chuyển đổi ngay lập tức sang các loại java.time trong Java 8 trở lên.

java.time.Instant

Một java.sql.Timestampbản đồ đến một java.time.Instant, một khoảnh khắc trên dòng thời gian trong UTC. Lưu ý phương thức chuyển đổi mới toInstantđược thêm vào lớp cũ.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Múi giờ

Áp dụng múi giờ mong muốn / dự kiến ​​( ZoneId) để có được a ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Chuỗi định dạng

Sử dụng a DateTimeFormatterđể tạo chuỗi của bạn. Các mã mẫu tương tự như mã java.text.SimpleDateFormatnhưng không chính xác, vì vậy hãy đọc tài liệu cẩn thận.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Định dạng cụ thể này không rõ ràng về ý nghĩa chính xác của nó vì nó không có bất kỳ dấu hiệu nào của offset-từ-UTC hoặc múi giờ.

ISO 8601

Nếu bạn có bất kỳ lời nói nào trong vấn đề này, tôi khuyên bạn nên cân nhắc sử dụng các định dạng ISO 8601 tiêu chuẩn thay vì tự lăn. Định dạng tiêu chuẩn khá giống với định dạng của bạn. Ví dụ :
2016-02-20T03:26:32+05:30.

Các lớp java.time sử dụng các định dạng tiêu chuẩn này theo mặc định, do đó không cần chỉ định một mẫu. Các ZonedDateTimelớp mở rộng định dạng chuẩn bằng cách thêm tên của múi giờ (một cải tiến khôn ngoan).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Chuyển đổi sang java.sql

Bạn có thể chuyển đổi từ java.time trở lại java.sql.Timestamp. Trích xuất một Instanttừ ZonedDateTime.

Các phương thức mới đã được thêm vào các lớp cũ để tạo điều kiện chuyển đổi sang / từ các lớp java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Bảng các loại thời gian ngày trong Java (cả di sản và hiện đại) và trong SQL tiêu chuẩn


Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Để tìm hiểu thêm, xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của bạn. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*lớp.

Nơi để có được các lớp java.time?

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval, YearWeek, YearQuarter, và nhiều hơn nữa .


Vì vậy, The Right Way để có được dấu thời gian đồng hồ treo tường hiện tại ở định dạng "yyyy.MM.dd.HH.mm.ss" là gì? Nếu không chỉ định rõ ràng chuỗi mã hóa cứng của múi giờ địa phương của tôi? Đó là những gì chủ đề bắt đầu được hỏi, và tôi không thể tìm thấy nó trong câu trả lời của bạn ...
t7ko

@ t7ko Tôi đã thêm một dòng mã ví dụ vào phần tl; dr cho biết cách hỏi rõ ràng về múi giờ mặc định hiện tại của JVM. Gọi `now () 'mà không có bất kỳ đối số nào thực hiện tương tự nhưng không rõ ràng nếu bạn có ý định sử dụng mặc định hoặc nếu bạn không biết hoặc quên về vấn đề quan trọng của múi giờ.
Basil Bourque

32

Bạn có thể sử dụng java.util.Date thay vì Dấu thời gian:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

6

Một cách tiếp cận phù hợp hơn là chỉ định vùng Locale làm tham số trong hàm tạo. Ví dụ dưới đây sử dụng một khu vực địa phương Hoa Kỳ. Định dạng ngày nhạy cảm với miền địa phương và sử dụng Ngôn ngữ để điều chỉnh thông tin liên quan đến phong tục và quy ước của Vùng người dùng Địa điểm (Nền tảng Java SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());

1
Không có thứ gì như khu vực Locale Khuem. Tôi nghi ngờ bạn đang nhầm lẫn Localevà múi giờ không liên quan. Localekiểm soát các chuẩn mực văn hóa để định dạng và ngôn ngữ của con người được sử dụng cho tên của tháng / ngày. Múi giờ điều chỉnh biểu diễn ngày giờ phù hợp với thời gian đồng hồ treo tường của một số khu vực . Trong trường hợp của Câu hỏi này, Locale không liên quan vì không có vấn đề định dạng nào để áp dụng các chuẩn mực văn hóa cũng như không có tên của tháng / ngày để bản địa hóa cho bất kỳ ngôn ngữ cụ thể nào của con người.
Basil Bourque

@BasilBourque Cảm ơn bạn đã đóng góp. Tôi đã cập nhật câu trả lời rõ ràng hơn
user3144836 23/2/2016

4

Bạn có thể sử dụng như sau

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Hy vọng điều này sẽ giúp. Chỉ là đề nghị của tôi và không cho điểm thưởng.


Nó không có định dạng chuỗi yêu cầu. Ngoài ra tôi sợ rằng điều duy nhất nó thêm vào một vài câu trả lời tương tự, là sự phức tạp không cần thiết
Ole

4

Sử dụng các java.timelớp hiện đại nếu bạn sử dụng java 8 hoặc mới hơn.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

Câu trả lời của Basil Bourque là khá tốt. Nhưng nó quá dài. Nhiều người sẽ không có kiên nhẫn để đọc nó. Top 3 câu trả lời quá cũ và có thể đánh lừa con ong mới của Java. Vì vậy, tôi cung cấp câu trả lời ngắn và hiện đại này cho các nhà phát triển mới sắp tới. Hy vọng câu trả lời này có thể làm giảm việc sử dụng khủng khiếp SimpleDateFormat.

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.