簡體   English   中英

面對Android中的DateFormat問題,CDT轉換為IST

[英]Facing DateFormat issue in Android, CDT converting into IST

我從Android手機獲得的時間是

“使用日期格式SimpleDateFormat(”EEE MMM dd HH:mm:ss zzz yyyy“,Locale.US)解析同一日期之后,”使用日期格式5月9日09:34:13 CD \\ 2016 \\ r \\ n \\ n \\ n“。

解析后給我一個日期

“Mon May 09 20:04:56 IST 2016”。

它清楚地表明,小時數增加了11個小時。

如何解決這個問題,有人可以幫助我嗎?

不要忘記Date類是一個完全沒有格式的類....

如果你想打印一個日期,你需要使用你創建的對象的格式方法...

例:

public static void main(String[] args) throws ParseException {
    String myDate = "Mon May 9 09:34:13 CDT 2016";
    SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
    Date d = dateFormat.parse(myDate);
    System.out.println(d);  // this is not formatted printing Mon May 09 16:34:13 CEST 2016
    System.out.println(dateFormat.format(d)); // this is printed using the same format you use above
}

TL;博士

您的印度時間比芝加哥時間提前10.5小時正確調整。 功能,而不是錯誤。 (我假設您:56秒是您問題中的拼寫錯誤。)

如果您不想進行此類調整,而是希望將相同的日期和相同的時間分配給不同的時區,請執行以下操作:

ZonedDateTime.parse(
    "Mon May 9 09:34:13 CDT 2016" ,  // If at all possible, avoid using such an awful format for exchanging date-time strings. Always use standard ISO 8601 formats instead.
    DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" )
)                                    // Returns a `ZonedDateTime` object.
.withZoneSameLocal( 
    ZoneId.of( "Asia/Kolkata" ) 
)                                    // Returns a fresh `ZonedDateTime` object, with values based on the original but for the change in assigned zone.
.toString()                          // Generates a String is standard ISO 8601 format, extending the standard by appending the name of the time zone in square brackets.

2016-05-09T09:34:13 + 05:30 [亞/加爾各答]

我們獲得相同的日期和相同的時間,但是與UTC的不同偏移意味着這是一個不同的時刻,時間軸上的不同點。

正確的價值觀

[注意:我假設:56你在Mon May 09 20:04:56 IST 2016Mon May 09 20:04:56 IST 2016 :56是一個錯字,應該是:13 ]

字符串Mon May 9 09:34:13 CDT 2016Mon May 09 20:04:13 IST 2016代表同一時刻。 這是一個功能,而不是一個bug。 如果CDT是指America/Chicago這樣的時區,則該日期的值表示 UTC時間 5小時的時間, -05:00 如果按照IST ,你指的是Asia/Kolkata這樣的時區,那個日期 UTC 5個半小時,+05 +05:30 將這些偏移量加在一起,我們得到相差十個半小時。 這適合: 09:34:1309:34:1309:34:13加10.5小時是20:04:13

換句話說,如果芝加哥的某個人正在通過電話與加爾各答的某個人交談,如果他們都在自己的牆上查看時間,那么人們會看到09:34:13,而另一個人看到20:04: 13。

也許你想故意調整時區,但是在相同的時間但是在不同的時區重新創建相同的日期。 不會是同一時刻,這將是時間軸上的不同點。 請參閱下面的代碼。

java.time

您正在使用很久以前被現代java.time類取代的麻煩的舊類。

如果可能,請避免操縱字符串作為處理日期時間的方法。 相反,使用智能對象,而不是愚蠢的字符串。

Instant instant = Instant.now() ;  // Capture current moment in UTC.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ; 
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, same point on the timeline, but different wall-clock time.

如果必須將日期時間值更改為文本,請使用標准ISO 8601格式,而不是問題中所示的格式。

此外,永遠不要使用3-4個字母的偽時區,如CDTIST 這些不是真正的時區,沒有標准化,許多不是唯一的(!)。 使用全區域名稱是IANA指定的 Continent/Region格式。

但直接對你的問題,解析字符串Mon May 9 09:34:13 CDT 2016 定義要匹配的格式模式。

String input = "Mon May 9 09:34:13 CDT 2016";

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

zdt.toString():2016-05-09T09:34:13-05:00 [美國/芝加哥]

ZonedDateTime::withZoneSameInstant

調整到印度時間。

ZoneId zKolkata = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant( zKolkata );

zdtKolkata.toString():2016-05-09T20:04:13 + 05:30 [亞洲/加爾各答]

與您在遺留類中看到的行為相同。 在09:34:13增加10.5小時,我們得到20:04:13。 同一時刻,時間軸上的相同點,但不同的掛鍾時間。

ZonedDateTime::withZoneSameLocal

但是,如果您想要相同的日期和相同的時間,但切換時區怎么辦? 這將導致不同的時刻,時間線上的不同點(假設兩個區域不共享相同的偏移)。 ZonedDateTime通過ZonedDateTime::withZoneSameLocal​(ZoneId zone)方法支持此操作。

ZonedDateTime zdtSameLocalKolkata = zdt.withZoneSameLocal( zKolkata );

zdtSameLocalKolkata.toString():2016-05-09T09:34:13 + 05:30 [亞洲/加爾各答]

現在我們看到時間不變,仍然是09:34:13。 但偏移從-UTC是比芝加哥不同,所以我們知道這並不代表同一時刻。

您可以通過將兩者都調整為UTC來驗證它們是不同的時刻。 進行調整的簡便方法是提取Instant對象。 根據定義, Instant始終為UTC。

Instant instantOfZdtChicago = zdt.toInstant() ;
Instant instantOfZdtSameLocalKolkata = zdtSameLocalKolkata.toInstant():

instantOfZdtChicago.toString():2016-05-09T14:34:13Z

instantOfZdtSameLocalKolkata.toString():2016-05-09T04:04:13Z


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

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

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

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

從哪里獲取java.time類?

暫無
暫無

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

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