2011-03-22 13 views
25

我想將時間戳2011-03-10T11:54:30.207Z轉換爲10/03/2011 11:54:30.207。我怎樣才能做到這一點?我想將ISO8601格式轉換爲UTC,然後該UTC應該是位置感知的。請幫助如何將時間戳從yyyy-MM-ddThh:mm:ss:SSSZ格式轉換爲MM/dd/yyyy hh:mm:ss.SSS格式?從ISO8601到UTC

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); 

異常:java.text.ParseException:無法解析的日期: 「2011-03-10T11:54:30.207Z」

回答

31

首先,你需要知道的是UTC是不是一個格式,這是一個時間段,有效。所以「從ISO8601轉換到UTC」並不是真正意義上的概念。

但是,下面是一個使用Joda Time的示例程序,它將文本解析爲DateTime並對其進行格式化。我猜想可能需要使用格式 - 你還沒有真正提供足夠的信息來說明你想要做什麼來說更多。您可能還想考慮時區...您是否想要在指定時間顯示本地時間?如果是這樣,您需要制定出用戶的時區並進行適當的轉換。

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

您好,我想知道「T」和「Z」代表什麼? – 2015-06-29 05:12:45

+2

@KevinZhao:'T'只是將時間與日期分開的方式; 'Z'表示UTC作爲時區的方式 - 「祖魯時間」。 – 2015-06-29 05:46:45

+0

謝謝。這真的幫了我最後的DateTimeFormatter解析器= ISODateTimeFormat.dateTime(); parsedDate = parser.parseDateTime(stringDate).toDate(); – 2016-09-21 00:09:59

-3

使用DateFormat。 (對不起,但簡短的問題不能保證更長或更詳細的答案。)

+0

對不起,任何不便。我得到 異常:java.text.ParseException:解析日期:「2011-03-10T11:54:30.207Z」錯誤請參閱我編輯過的問題。 – user617966 2011-03-22 16:20:55

0

輸入原始日期到a Date object,然後打印出結果與a DateFormat。如果the automatic parse method不接受您的格式,則可能必須將字符串拆分爲較小的部分以創建最初的對象Date

僞代碼:

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

我收到parseException – user617966 2011-03-22 16:14:52

+1

String str_date =「2011-03-10T11:54:30.207Z」; DateFormat格式化程序; 日期日期; formatter = new SimpleDateFormat(「dd/MM/yyyy hh:mm:ss.SSS」); date =(Date)formatter.parse(str_date); System.out.println(「output:」+ date); 異常:java.text.ParseException:Unparseable日期:「2011-03-10T11:54:30.207Z」 – user617966 2011-03-22 16:15:10

+1

據我所知SimpleDateFormat不是線程安全的,如果您需要線程安全解決方案,請使用joda-time和使用[PeriodFormatterBuilder](http://joda-time.sourceforge.net/apidocs/org/joda/time/format/PeriodFormatterBuilder.html)構建格式化程序,並儘可能享受簡單的日期處理。 – moritz 2011-03-22 16:21:04

0

你可能想看看joda time,這是一個小更容易比Java本地最新的工具來使用,並提供了許多常見的日期模式的預建。

在迴應評論,更多詳細信息:

要做到這一點使用約達時間,你需要兩個DateTimeFormatters - 一個爲你的輸入格式解析您的輸入和一個輸出格式打印您的輸出。你的輸入格式是ISO標準格式,所以Joda時間的ISODateTimeFormat類已經有一個靜態方法和一個解析器:dateHourMinuteSecondMillis。你的輸出格式不是他們有預建格式器的格式,所以你必須使用DateTimeFormat自己創建一個。我認爲DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS");應該做的伎倆。一旦你有兩個格式化器,在輸出格式上調用parseDateTime()方法,在輸出格式上調用print方法,以字符串形式得到結果。

將其組合在一起應該是這個樣子(警告,未經測試):

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

我得到 異常:java.text.ParseException:Unparseable日期:「2011-03-10T11:54:30.207Z」錯誤看到我編輯的問題。 – user617966 2011-03-22 16:21:51

+0

我已經下載了喬達時間,但不知道如何將ISO8601轉換爲UTC格式。請指導 – user617966 2011-03-22 18:01:09

+0

@ user617966:UTC不是格式,它是一個時區(有效)。 – 2011-03-22 18:16:47

28

是的。你可以像這樣使用SimpleDateFormat。

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)); 

輸出 OldDate - > 2011-03-10T11:54:30.207Z NewDate - > 10-MAR-2011 11時54分三十秒。207

+2

正面朝上,小寫'hh'是12小時格式,'HH'是24小時 – 2017-06-29 15:53:42

0

希望這有助於:

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