2011-03-22 20 views
25

Zaman damgasını 2011-03-10T11: 54: 30.207Z - 10/03/2011 11: 54: 30.207'ye dönüştürmek istiyorum. Bunu nasıl yapabilirim? ISO8601 formatını UTC'ye dönüştürmek istiyorum ve UTC'nin konum farkında olması gerekiyor.Nasıl yyyy-AA-ddThh bir zaman damgası dönüştürebilirsiniz: mm: ss: SSSZ biçimi için MM/gg/yyyy ss: dd: ss.SSS biçimi? ISO8601'den UTC'ye

String str_date="2011-03-10T11:54:30.207Z"; 
DateFormat formatter ; 
Date date ; 
formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS"); 
date = (Date)formatter.parse(str_date); 
System.out.println("output: " +date); 

İstisna yardım edin: java.text.ParseException: Ayrıştırılamayan tarihi: "2011-03-10T11: 54: 30.207Z"

cevap

31

Öncelikle, UTC bir biçim olmadığını farkında olması gerekir, etkili bir zaman dilimi var. Yani "ISO8601'den UTC'ye dönüştürme" aslında bir kavram olarak anlam ifade etmiyor. Ancak, buradaki metni, DateTime'a gönderen ve sonra biçimlendiren Joda Time kullanan bir örnek programdır. Kullanmak isteyebileceğiniz bir biçiminde numaralı telefondan tahmin ettim - bundan daha fazlasını söylemek için yapmaya çalıştığınız şey hakkında yeterince bilgi vermediniz. Ayrıca, saat dilimlerini de düşünmek isteyebilirsiniz ... belirtilen anda yerel saatini görüntülemek ister misiniz? Öyleyse, kullanıcının saat dilimini çalışmanız ve uygun şekilde dönüştürmeniz gerekir.

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2011-03-10T11:54:30.207Z"; 
     DateTimeFormatter parser = ISODateTimeFormat.dateTime(); 
     DateTime dt = parser.parseDateTime(text); 

     DateTimeFormatter formatter = DateTimeFormat.mediumDateTime(); 
     System.out.println(formatter.print(dt)); 
    } 
} 
+0

Merhaba, "T" ve "Z" nin neyi temsil ettiğini merak ediyordum? –

+2

@KevinZhao: 'T', zamanı bugünden ayırmanın yoludur; 'Z', UTC'yi saat dilimi olarak belirtmenin yoludur - "Zulu zaman". –

+0

Teşekkür ederim. Bu gerçekten bana son DateTimeFormatter ayrıştırıcı yardımcı oldu = ISODateTimeFormat.dateTime(); parsedDate = parser.parseDateTime (stringDate) .toDate(); –

-3

kullanın DateFormat. (Üzgünüz, ama sorunun kısalığı, daha uzun veya daha ayrıntılı bir yanıt gerektirmez.)

+0

üzgünüm. İstisnası alıyorum: java.text.ParseException: Hazırlanamayan tarih: "2011-03-10T11: 54: 30.207Z" hatası, düzenlediğim soruma bakın. – user617966

0

Orijinal tarihi a Date object içine girin ve sonucu a DateFormat ile yazdırın. the automatic parse method biçiminizi kabul etmiyorsa, ilk Date nesnesini oluşturmak için dizeyi daha küçük parçalara bölmeniz gerekebilir.

yalancı kod:

Date inputDate = convertYourInputIntoADateInWhateverWayYouPrefer(inputString); 
DateFormat outputFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss.SSS"); 
String outputString = outputFormat.format(inputDate); 
+0

ParseException alıyorum – user617966

+1

String str_date = "2011-03-10T11: 54: 30.207Z"; DateFormat biçimlendiricisi; Tarih; biçimlendirici = new SimpleDateFormat ("dd/AA/yyyy ss: dd: ss.SSS"); date = (Tarih) formatter.parse (str_date); System.out.println ("output:" + date); İstisna: java.text.ParseException: Hazırlanamayacak tarih: "2011-03-10T11: 54: 30.207Z" – user617966

+1

Bildiğim kadarıyla SimpleDateFormat iş parçacığı için güvenli bir çözüm gerekmiyorsa, iş parçacığı güvenli DEĞİLDİR. Örneğin, [PeriodFormatterBuilder] (http://joda-time.sourceforge.net/apidocs/org/joda/time/format/PeriodFormatterBuilder.html) ile bir biçimlendirici oluşturun ve olması gerektiği gibi kolay bir şekilde işlemenin tadını çıkarın. – moritz

0

Sen java yerli tarih araçları daha kullanmak biraz daha kolay olduğunu ve birçok ortak tarih desenler önceden oluşturulmuş sağlar joda time bir göz, olmasını isteyebilirsiniz. Yorumlara yanıt olarak

, daha ayrıntı: - senin çıkışını yazdırmak için çıkış biçimi için giriş ayrıştırmak için giriş formatı için bir ve tek

bu kullanarak Joda zamanı yapmak için, iki DateTimeFormatters gerekir. Girdi biçiminiz bir ISO standart biçimidir, bu nedenle Joda saatinin ISODateTimeFormat sınıfı zaten bunun için bir çözümleyici ile statik bir yöntem vardır: dateHourMinuteSecondMillis. Çıktı biçiminiz, önceden oluşturulmuş bir biçimlendiriciye sahip olmadığı için, DateTimeFormat'u kullanarak kendiniz bir tane oluşturmanız gerekir. Bence DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS"); hile yapmalı. İki biçimlendiricinizi aldıktan sonra, giriş biçiminde parseDateTime() yöntemini ve sonucunuzu almak için çıktı biçimindeki print yöntemini bir dize olarak çağırın.

bu (, denenmemiş uyarı) gibi görünmelidir Bir araya getirmek:

DateTimeFormatter input = ISODateTimeFormat.dateHourMinuteSecondMillis(); 
DateTimeFormatter output = DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS"); 
String outputFormat = output.print(input.parseDate(inputFormat)); 
+0

alıyorum Özel Durum: java.text.ParseException: Hazırlanamayan tarih: "2011-03-10T11: 54: 30.207Z" hatası, düzenlediğim soruma bakın. – user617966

+0

Joda saatini indirdim ama ISO8601'i UTC formatına dönüştürmeyi bilmiyorum. Lütfen – user617966

+0

@ user617966 kılavuzuna bakın: UTC bir biçim değil, bir saat dilimidir (etkin). –

28

Evet. SimpleDateFormat'i bu şekilde kullanabilirsiniz.

SimpleDateFormat formatter, FORMATTER; 
formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
String oldDate = "2011-03-10T11:54:30.207Z"; 
Date date = formatter.parse(oldDate.substring(0, 24)); 
FORMATTER = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS"); 
System.out.println("OldDate-->"+oldDate); 
System.out.println("NewDate-->"+FORMATTER.format(date)); 

Çıktı OldDate -> 2011-03-10T11: 54: 30.207Z newdate -> 10-Mar-2011 11:54:30.207

+2

başlar, küçük harf 'hh' 12 saat biçimindedir,' HH' 24 saattir –

0

Umut bu yardımcı olur: rahatsızlıktan dolayı

public String getSystemTimeInBelowFormat() { 
    String timestamp = new SimpleDateFormat("yyyy-mm-dd 'T' HH:MM:SS.mmm-HH:SS").format(new Date()); 
    return timestamp; 
} 
İlgili konular