Java SimpleDateFormat (Hy yyyy-MM-dd'T'HH: mm: ss'Z '') cung cấp múi giờ như IST


148

Tôi có hàm tạo SimpleDateFormat là

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

và tôi đang phân tích chuỗi "2013-09-29T18:46:19Z".

Tôi đã đọc rằng ở đây Z đại diện cho GMT/UTCmúi giờ. nhưng khi tôi in ngày này trên bàn điều khiển, nó sẽ in IST timezne cho ngày trả lại.

Bây giờ câu hỏi của tôi là liệu đầu ra của tôi là đúng hay sai?


3
vâng, đó là những gì 'Z' đại diện. Z- Múi giờ
Woody

5
Z = Zulu time => GMT + 0, rõ ràng bạn không phục vụ quốc gia của mình;)
MushyPeas

Câu trả lời:


250

Bạn chưa đặt múi giờ chỉ thêm một Zvào cuối ngày / giờ, vì vậy nó sẽ trông giống như ngày / giờ GMT nhưng điều này không thay đổi giá trị.

Đặt múi giờ thành GMT và nó sẽ chính xác.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

3
Nếu bạn có một ngày, giả sử 2012-12-06T06: 00: 00 mà không có Z, điều đó có đại diện cho GMT không?
nhị phân

3
@binarygiant Bạn sẽ phải hỏi những người đã gửi nó. Nó có thể là giờ địa phương của người gửi.
Peter Lawrey

2
Múi giờ có thể được đặt thành "UTC"
Prashanth

2
Thay vì đặt múi giờ ở nhiều nơi cho các thư viện khác nhau và tránh xung đột với múi giờ của máy / máy tính xách tay của bạn, bạn nên luôn đặt múi giờ mặc định của JVM bằng cách đặt thuộc tính hệ thống user.timezone: java -Duser.timezone = GMT ...
kisna 15/03/18

100

'T''Z'được coi ở đây là hằng số. Bạn cần phải vượt qua Zmà không có dấu ngoặc kép. Ngoài ra, bạn cần chỉ định múi giờ trong chuỗi đầu vào.

Ví dụ: 2013-09-29T18:46:19-0700 Và định dạng như"yyyy-MM-dd'T'HH:mm:ssZ"


Subir, Cảm ơn câu trả lời của bạn, nhưng "0700" được thêm vào chuỗi đầu vào là gì ??
Pradip Borde

-0700là múi giờ tức là -7: 00 giờ
Subir Kumar Sao

12
cho -07: 00 giờ và không -0700 nó sẽ là như sau: dd-MM-dd'T'HH: mm: ss.SSSXXX
Tastybrownies

48

Từ chuỗi ISO 8601 đến đối tượng ngày Java

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013

nếu bạn không đặt TimeZone.getTimeZone("GMT")thì nó sẽ xuấtSun Sep 29 18:46:19 CST 2013

Từ đối tượng ngày Java đến chuỗi ISO 8601

Và để chuyển đổi Dateđối tượng sang ISO 8601 Standard ( yyyy-MM-dd'T'HH:mm:ss'Z'), hãy sử dụng mã sau đây

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));           
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z

Cũng lưu ý rằng không có in ' 'Zyyyy-MM-dd'T'HH:mm:ssZ2015-01-22T03:41:02+0000


2
Nó mang lại cho tôi java.text.PudeException: Ngày không thể phát hiện: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....

41

NẾU bạn muốn xử lý biểu diễn JSON ' tiêu chuẩn ' của Ngày thì tốt hơn nên sử dụng mẫu này : "yyyy-MM-dd'T'HH:mm:ssX".

Chú ý Xvào cuối. Nó sẽ xử lý các múi giờ theo tiêu chuẩn ISO 8601 và ISO 8601 chính xác là những gì tạo ra tuyên bố này trong Javascriptnew Date().toJSON()

So với các câu trả lời khác, nó có một số lợi ích:

  1. Bạn không cần yêu cầu khách hàng gửi ngày trong GMT
  2. Bạn không cần phải chuyển đổi rõ ràng đối tượng Ngày của mình sang GMT bằng cách này: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

1
Tôi đang sử dụng playràng buộc biểu mẫu tự động và sử dụng @Format.DateTimechú thích. Sử dụng mẫu mặc định với Zkết thúc dường như không chính xác. Sau khi thay đổi X, nó hoạt động. Rất cám ơn
transang

Nếu ngày của bạn chỉ định múi giờ theo kiểu tuân thủ RFC822 như "-0500", thì điều này hoạt động tốt. Nhưng đối với một ngày như "2013-07-15T10: 22: 17-05: 00" (cũng là ISO8601 TZ hợp lệ) thì điều này sẽ phá vỡ. Trong trường hợp đó, bạn cần sử dụng "yyyy-MM-dd'T'HH: mm: ssXXX".
Lambart

23

tl; dr

Các câu trả lời khác đã lỗi thời kể từ Java 8.

Instant                           // Represent a moment in UTC. 
.parse( "2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone(                          // Adjust from UTC to a time zone. 
    ZoneId.of( "Asia/Kolkata" )
)                                 // Returns a `ZonedDateTime` object. 

ISO 8601

Định dạng chuỗi của bạn xảy ra tuân thủ tiêu chuẩn ISO 8601 . Tiêu chuẩn này xác định các định dạng hợp lý để biểu thị các giá trị thời gian khác nhau dưới dạng văn bản.

java.time

java.util.Date/ .Calendarjava.text.SimpleDateFormatcác lớp học đã được thay thế bởi khuôn khổ java.time xây dựng vào Java 8 và sau đó. Xem hướng dẫn . Tránh các lớp cũ vì chúng đã được chứng minh là được thiết kế kém, khó hiểu và rắc rối.

Một phần của thiết kế kém trong các lớp cũ đã cắn bạn, trong đó toStringphương thức áp dụng múi giờ mặc định hiện tại của JVM khi tạo biểu diễn văn bản của giá trị thời gian thực sự có trong UTC (GMT); có thiện chí nhưng khó hiểu.

Các lớp java.time sử dụng các định dạng ISO 8601 theo mặc định khi phân tích / tạo các biểu diễn văn bản của các giá trị thời gian. Vì vậy, không cần chỉ định một mô hình phân tích cú pháp.

An Instantlà một khoảnh khắc trên dòng thời gian trong UTC .

Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );

Bạn có thể áp dụng múi giờ khi cần thiết để tạo ZonedDateTimeđối tượng.

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

Bảng các loại thời gian trong Java, cả hiện đại và di sản


22

và nếu bạn không có tùy chọn để sử dụng java8, hãy sử dụng tốt hơn 'yyyy-MM-dd'T'HH: mm: ssX XX ' vì điều này sẽ được phân tích chính xác một lần nữa (trong khi chỉ có một X thì điều này có thể không xảy ra. .. tùy thuộc vào chức năng phân tích cú pháp của bạn)

X tạo: +01

XXX tạo: +01: 00


0

Đối với Java 8: Bạn có thể sử dụng inbuilt java.time.format.DateTimeFormatterđể giảm bất kỳ lỗi chính tả nào, như

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

Đại diện ISO_ZONED_DATE_TIME 2011-12-03T10:15:30+01:00[Europe/Paris]là một trong những định dạng DateTime tiêu chuẩn được cung cấp bởi liên kết Oracle

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.