簡體   English   中英

使用時區java將字符串轉換為適當的日期

[英]Convert string to appropriate date with timezone java

我有它的時區日期,我想將它轉換為另一個時區,例如我有日期'3/15/2013 3:01:53 PM',它在時區'GMT-06:00'。 我想在“GMT-05:00”時區轉換它。 我有很多搜索,但我對 Date 的實際工作方式感到困惑。 如何將時區應用到日期。 我嘗試使用 SimpleDateFormat、Calender 和偏移量。

DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa XXX");
df.setTimeZone(TimeZone.getTimeZone("GMT")); 
Date dt = null;
try {
    dt = df.parse("3/15/2013 3:01:53 PM -06:00");
} catch (ParseException e) {
    e.printStackTrace();
} 
String newDateString = df.format(dt);
System.out.println(newDateString);

它返回輸出03/15/2013 09:01:53 AM Z 我想應該是03/15/2013 09:01:53 PM Z ,因為時間在 'GMT-06:00' 時區,所以應該是 HH+6 以獲取格林威治標准時間的時間。 我想要“yyyy-MM-dd HH:mm:ss”格式的日期,其中 HH 是 24 小時。請幫我舉例。 提前致謝。

編輯 :

我正在使用 SimpleDateFormat 將字符串轉換為日期

DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa");
    Date dt = null;
    try {
        dt = df.parse("3/15/2013 3:01:53 PM");
    } catch (ParseException e) {
        e.printStackTrace();
    }

現在,正如您所說,我向日歷指定我的日期在“GMT-06:00”時區並設置我的日期,

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-6"));
cal.setTime(dt);

現在,我告訴日歷我想要“GMT”中的日期

cal.setTimeZone (TimeZone.getTimeZone("GMT"));

System.out.println(cal.getTime());

輸出:

Fri Mar 15 03:01:53 CDT 2013

如果我出錯了,請知道我。

您需要兩個格式對象,一個用於解析,另一個用於打印,因為您使用兩個不同的時區,請參見此處:

// h instead of H  because of AM/PM-format
DateFormat parseFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX"); 
Date dt = null;
try {
  dt = parseFormat.parse("3/15/2013 3:01:53 PM -06:00");
}catch (ParseException e) {
  e.printStackTrace();
} 

DateFormat printFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX"); 
printFormat.setTimeZone(TimeZone.getTimeZone("GMT-05")); 
String newDateString = printFormat.format(dt);
System.out.println(newDateString);

輸出:3/15/2013 04:01:53 PM -05:00

如果你想要 HH:mm:ss(24 小時格式),那么你只需替換

hh:mm:ss aaa 

經過

HH:mm:ss

在打印格式模式中。


評論問題的其他方面:

java.util.Date沒有內部時區,並且始終按規范引用 UTC。 您不能在此對象內更改它。 格式化字符串可以進行時區轉換,但是如我的代碼示例所示(您想轉換為區域 GMT-05)。

然后問題切換到使用 UTC 時區(符號 Z)以 ISO 格式打印Date的新要求。 這可以通過用“yyyy-MM-dd'T'HH:mm:ssXXX”替換模式並將printFormat的時區顯式設置為GMT+00來完成。 您應該澄清您真正想要的格式化輸出。

關於java.util.GregorianCalendar :在此處設置時區是以編程方式更改日歷對象,因此它會影響諸如calendar.get(Calendar.HOUR_OF_DAY)類的方法調用。 然而,這與格式無關!

tl;博士

OffsetDateTime.parse( 
    "3/15/2013 3:01:53 PM -06:00" , 
    DateTimeFormatter.ofPattern( "M/d/yyyy H:mm:ss a XXX" )
).withOffsetSameInstant( 
    ZoneOffset.of( -5 , 0 ) 
)

2013-03-15T15:01:53-06:00

時間

Hochschild答案是正確的,但使用了過時的課程。 與最早版本的 Java 捆綁在一起的麻煩的舊日期時間類已被現代java.time類所取代。

將您的輸入字符串解析為OffsetDateTime因為它包含從 UTC 開始的偏移量但不包含時區。

String input = "3/15/2013 3:01:53 PM -06:00";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/yyyy h:mm:ss a XXX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );

odt.toString(): 2013-03-15T15:01:53-06:00

提示:將日期時間數據作為文本交換時,可以省去一些麻煩並使用 ISO 8601 格式。 java.time 類在解析/生成字符串時默認使用這些標准格式。

顯然,您希望看到與其他地方的人使用不同的 UTC 偏移量所看到的同一時刻。

ZoneOffset offset = ZoneOffset.of( -5 , 0 ) ;
OffsetDateTime odt2 = odt.withOffsetSameInstant( offset ) ;

我們看到偏移量從 6 變為 5,一天中的小時相應地從 15 變為 16。同一時刻,不同的掛鍾時間。

odt2.toString(): 2013-03-15T16:01:53-05:00

生成字符串

我想要“yyyy-MM-dd HH:mm:ss”格式的日期,其中 HH 為 24 小時。

我建議你總是包含一些偏移或區域的指示,除非你絕對確定用戶從更大的上下文中理解。

您的格式幾乎是標准的 ISO 8601 格式。 您可以定義自己的格式模式,但我只會進行字符串操作以將中間的T替換為空格。

String output = odt2.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " ) ;

2013-03-15 16:01:53


關於java.time

java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.DateCalendar ,和SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle 教程 並在 Stack Overflow 上搜索許多示例和解釋。 規范是JSR 310

使用符合JDBC 4.2或更高版本的JDBC 驅動程序,您可以直接與您的數據庫交換java.time對象。 不需要字符串或 java.sql.* 類。

從哪里獲得 java.time 類?

ThreeTen-Extra項目用額外的類擴展了 java.time。 該項目是未來可能添加到 java.time 的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM