[英]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)
類的方法調用。 然而,這與格式無關!
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 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.Date
, Calendar
,和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 的試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.