2013-02-15 47 views
2

我看到過幾個像這樣的問題,但我無法完全獲得轉換權。我想一個日期轉換像下面Java轉換時區

20121116203036Z

2012年11月16日15:30:36

我有以下代碼

dateStringTime.set(year, mon-1 , day, hour, minute, second); 

    Date date = dateStringTime.getTime(); 

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    formatter.setTimeZone(TimeZone.getTimeZone("EST")); 

    String output = formatter.format(); 
    return output; 

哪些工作,但它給了我以下

2012年11月16日20時30分36秒

上的任何意見如何得到而不是?

回答

1

TimeZone。 getDefault()將給運行時區。 如果您將從date中刪除getRawOffet值,那麼您將獲得UTC。 一個步驟是添加/從UTC刪除EST值,並進行轉換

+0

請避免手動進行時間計算,特別是當實際上有一個簡單的解決方案不涉及這樣做時。 – 2013-02-15 20:30:16

1

首先,你的代碼不格式化「日期」,試試這個:

String output = formatter.format(date); 

我也注意到你是不向我們展示如何創建dateStringTime,我認爲它是Calendar。我注意到Calendar.getInstance()方法也接受可能影響時區的Locale

我的代碼:

Calendar dateStringTime = Calendar.getInstance(); 

    //convert 20121116203036Z  
    int year = 2012; 
    int mon = 11; 
    int day = 16; 
    int hour = 20; 
    int minute = 30; 
    int second = 36; 

    dateStringTime.set(year, mon-1 , day, hour, minute, second); 

    Date date = dateStringTime.getTime(); 

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    formatter.setTimeZone(TimeZone.getTimeZone("EST")); 

    String output = formatter.format(date); 
    System.out.println(output);  

我的輸出:

2012-11-16 21:30:36 

您注意到時間爲1小時了嗎?那是因爲我在中央時區,當我要求'EST'時,JVM正在考慮這一點。它認爲原始時間是在當前時區。

當你註釋掉

 //formatter.setTimeZone(TimeZone.getTimeZone("EST")); 
+0

當我這樣做,我得到... 2012-11-17 01:30:36 – 2013-02-15 19:21:55

+0

提示:「convert 20121116203036Z」*後面的代碼是不是這樣做*。 – 2013-02-15 20:28:04

0

你的問題是,你進入了錯誤的時區的日期會發生什麼。當你這樣做

dateStringTime.set(year, month-1 , day, hour, minute, second); 

你實際上是使用默認時區輸入日期,這在你的情況下不太可能是UTC。在封面下,Java Date以UTC表示,所以它將將日期/時間翻譯爲UTC,而不是直接輸入UTC。

基本上,它在做什麼時區轉換的順序如下:EST - > UTC - > EST

如果你打算使用UTC指定日期/時間,你應該這樣做:

dateStringTime.setTimeZone(TimeZone.getTimeZone("UTC")); 
dateStringTime.set(year, month-1 , day, hour, minute, second); 

那麼你只會從UTC - > EST開始,你應該得到正確的輸出。

0

TL;博士

OffsetDateTime.parse(
    "20121116203036Z" , 
    DateTimeFormatter.ofPattern("yyyyMMddHHmmssX") 
).toLocalDateTime() 
.toString() 
.replace("T" , " ") 

java.time

內置Java中的java.time類使這個容易。避免麻煩的舊日期時間課程,如Date & DateFormat,現在是遺留問題。

String input = "20121116203036Z"; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyyMMddHHmmssX"); 
OffsetDateTime odt = OffsetDateTime.parse(input , f); 

odt.toString():2012-11-16T20:30:36Z

爲了讓你的輸出,你可以自定義一個DateTimeFormatter。一種更爲懶惰的方法是轉換爲LocalDateTime,僅僅在最後丟失了Z,這表明與UTC的偏移量(ZZulu的縮寫,意爲UTC)。然後使用toString生成一個ISO 8601格式的字符串,除了用SPACE替換中間的T

String output = odt.toLocalDateTime().toString().replace("T" , " "); 

2012年11月16日二十時30分36秒

live code in IdeOne.com

ISO 8601

我建議,而不是用你這樣的日期時間值的格式,而是使用ISO 8601標準格式。這種值的通常格式是2016-11-16T02:45:02Z。請注意0​​在中間分隔的年中 - 月 - 日 - 時分秒。或者,該標準允許最小化分離器的使用,被認爲是「基本」版本:20161116T024502Z,但保留中間的T

java.time類可以解析和生成擴展版本,但不是基本版本。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了令人討厭的舊日期時間類,例如java.util.Date,.Calendar,& java.text.SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

大部分的java.time功能後移植到Java 6 和ThreeTenABP還適於Android(見How to use…)。

ThreeTen-Extra項目擴展java.time與其他類。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore