Java SimpleDateFormat ("yyyy-MM-gg'T'HH: mm: ss'Z"), saat dilimini IST olarak verir


156

SimpleDateFormat yapıcısına sahibim.

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

ve dizeyi ayrıştırıyorum "2013-09-29T18:46:19Z".

Burada Z'nin GMT/UTCzaman dilimini temsil ettiğini okudum . ancak bu tarihi konsolda yazdırdığımda, iade tarihi için IST zaman dilimi yazdırıyor.

Şimdi sorum çıktımın doğru mu yanlış mı?


3
evet, 'Z'nin temsil ettiği şey budur. Z- Saat Dilimi
Woody

5
Z = Zulu saati => GMT + 0, belli ki ülkenize hizmet
etmediniz

Yanıtlar:


261

ZSaat dilimini ayarlamadınız, yalnızca tarih / saatin sonuna a eklediniz , bu nedenle bir GMT tarihi / saati gibi görünecek, ancak bu değeri değiştirmez.

Saat dilimini GMT olarak ayarlayın ve doğru olacaktır.

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

3
Bir tarihiniz varsa, 2012-12-06T06: 00: 00 deyin, bu GMT'yi temsil ediyor mu?
binarygiant

3
@binarygiant Gönderenlere sormanız gerekir. Gönderenin yerel saati olabilir.
Peter Lawrey

2
Saat dilimi "UTC" olarak ayarlanabilir
Prashanth

2
Saat dilimini pek çok yerde farklı kitaplıklar için ayarlamak ve makinenizin / dizüstü bilgisayarınızın saat dilimiyle çakışmaları önlemek yerine, user.timezone system özelliğini ayarlayarak JVM'nin varsayılan saat dilimini her zaman ayarlamalısınız: java -Duser.timezone = GMT ...
kisna

104

'T've 'Z'burada sabitler olarak kabul edilir. Sen geçmesi gerekiyor Ztırnak işaretleri olmadan. Ayrıca, giriş dizesinde saat dilimini belirtmeniz gerekir.

Örnek: 2013-09-29T18:46:19-0700 Ve format"yyyy-MM-dd'T'HH:mm:ssZ"


Subir, Cevabınız için teşekkürler, ancak giriş dizesine eklenen "0700" nedir?
Pradip Borde

-0700saat dilimidir, yani -7: 00 Saat
Subir Kumar Sao

16
-07: 00 saat için ve -0700 için aşağıdaki gibi olacaktır: yyyy-AA-gg'T'HH: dk: ss.SSXXX
Tastybrownies

49

ISO 8601 Dizisinden Java Tarih Nesnesine

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

Eğer ayarlamazsanız TimeZone.getTimeZone("GMT")çıktı verecektirSun Sep 29 18:46:19 CST 2013

Java Tarih Nesnesinden ISO 8601 Dizesine

Ve Datenesneyi ISO 8601 Standardına ( yyyy-MM-dd'T'HH:mm:ss'Z') dönüştürmek için aşağıdaki kodu kullanın

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

Ayrıca ' 'Z yyyy-MM-dd'T'HH:mm:ssZbaskı olmadan2015-01-22T03:41:02+0000


2
Bana java.text.ParseException: Unparseable date: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....

41

Eğer 'işlemek istiyorum IF standart Tarihi' JSON temsilini o zaman daha iyi bu kalıbı kullanmak: "yyyy-MM-dd'T'HH:mm:ssX".

XSonunda dikkat edin . ISO 8601 standardındaki saat dilimlerini işleyecektir ve ISO 8601, Javascript'te bu ifadeyi tam olarak üreten şeydir.new Date().toJSON()

Diğer cevaplarla karşılaştırıldığında bazı faydaları vardır:

  1. Müşterilerinizin GMT'de tarih göndermesini istemenize gerek yok
  2. Bunu kullanarak Date nesnenizi açıkça GMT'ye dönüştürmenize gerek yoktur: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

1
Ben kullanıyorum play'ın otomatik bağlanma şeklini ve kullanım @Format.DateTimeek açıklama. Bitişte ile varsayılan kalıbı kullanmak Zyanlış gibi görünüyor. Olarak değiştirildikten sonra Xçalışır. Çok teşekkürler
transang

Tarihiniz saat dilimini "-0500" gibi RFC822 uyumlu bir şekilde belirtiyorsa, bu sorunsuz çalışır. Ancak "2013-07-15T10: 22: 17-05: 00" (ayrıca geçerli ISO8601 TZ) gibi bir tarih için bu kesinti olur. Bu durumda "yyyy-AA-gg'T'HH: mm: ssXXX" kullanmanız gerekir.
Lambart

30

tl; dr

Diğer Cevaplar Java 8'den itibaren modası geçmiş durumda.

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

Dize biçiminiz ISO 8601 standardına uygun. Bu standart, çeşitli tarih-saat değerlerini metin olarak göstermek için mantıklı formatlar tanımlar.

java.time

Eski java.util.Date/ .Calendarve java.text.SimpleDateFormatsınıfların yerini Java 8 ve sonraki sürümlerde yerleşik olan java.time çerçevesi almıştır. Öğreticiye bakın . Kötü tasarlanmış, kafa karıştırıcı ve zahmetli oldukları kanıtlanan eski sınıflardan kaçının .

Eski sınıflardaki zayıf tasarımın bir kısmı sizi ısırdı, burada toStringyöntem, gerçekte UTC (GMT) cinsinden olan tarih-saat değerinin bir metin gösterimini oluştururken JVM'nin geçerli varsayılan saat dilimini uygular; iyi niyetli ama kafa karıştırıcı.

Java.time sınıfları, tarih-saat değerlerinin metinsel temsillerini ayrıştırırken / üretirken varsayılan olarak ISO 8601 biçimlerini kullanır. Bu nedenle, bir ayrıştırma kalıbı belirlemenize gerek yoktur.

An Instant, UTC'de zaman çizelgesindeki bir andır .

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

Bir nesneyi üretmek için gerektiği kadar zaman dilimi uygulayabilirsiniz ZonedDateTime.

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

Hem modern hem de eski Java'daki tarih-saat türleri tablosu


22

ve java8'e devam etme seçeneğiniz yoksa, 'yyyy-MM-gg'T'HH: mm: ssX XX ' kullanın, çünkü bu tekrar doğru bir şekilde ayrıştırılır (yalnızca bir X ile durum böyle olmayabilir. .. ayrıştırma işlevinize bağlı olarak)

X üretir: +01

XXX oluşturur: +01: 00


0

Java 8 için:java.time.format.DateTimeFormatter Herhangi bir yazım hatası olasılığını azaltmak için dahili kullanabilirsiniz.

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME 2011-12-03T10:15:30+01:00[Europe/Paris], Oracle bağlantısı tarafından sağlanan paketlenmiş standart DateTime biçimlerinden biridir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.