簡體   English   中英

無法在 Android 上將 UTC 轉換為本地時間

[英]Unable Convert UTC into Local Time on Android

我在 UTC 中有一個日期 '2022-04-09 11:16:32' 我想將它轉換為 IST 它應該是我正在使用的代碼中的 '2022-04-09 04:46:32'

String date = dataItem.getTime().replaceAll("-","/");
        try {
            DateFormat utcFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

            Date d = utcFormat.parse(date);

            DateFormat pstFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            pstFormat.setTimeZone(TimeZone.getTimeZone("IST"));


            holder.date.setText(pstFormat.format(d));
        } catch (ParseException e) {
            e.printStackTrace();
        }

但它打印 2022/04/09 10:16:32 這不是實際時間。 請幫我。

tl;博士

LocalDateTime
.parse( 
    "2022-04-09 11:16:32"
    .replace( " " , "T" )  
)
.atOffset(
    ZoneOffset.UTC
)
.atZoneSameInstant(
    ZoneId.of( "Asia/Kolkata" )
)
.format(
   DateTimeFormatter.ISO_LOCAL_DATE_TIME
)
.replace( "T" , " " )

請參閱在 IdeOne.com 上實時運行的代碼。

2022-04-09 16:46:32

避免遺留日期時間類

在更改字符串以符合 ISO 8601 標准后,切勿使用可怕的遺留日期時間類,例如Date

LocalDateTime

將您的輸入解析為LocalDateTime

String input = "2022-04-09 11:16:32".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;

OffsetDateTime

顯然,您確定提供的帶時間日期字符串是 UTC 中的一個時刻,具有零小時-分鍾-秒的偏移量。

因此,應用零偏移量(定義為常量)來生成OffsetDateTime object。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

ZonedDateTime

接下來您要從 UTC 調整到特定時區。 應用ZoneId以獲得ZonedDateTime 結果表示同一時刻,時間軸上的同一點,但日期和時間與該時區中的日期和時間相同。

沒有像IST這樣的時區。 也不是CSTPDT等。這些 2-4 個字符的偽區域不是實時區域。 它們不是標准化的,甚至不是唯一的,這些僅適用於向用戶展示。 絕不用於數據交換或數據存儲。 實時時區的名稱格式為Continent/Region

對於IST ,您可能指的是Europe/DublinAsia/Kolkata

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ; 

要生成所需的文本,請使用DateTimeFormatter定義您自己的自定義格式設置模式。 或者使用 ISO 8601 的預定義格式化程序,並刪除T

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

似乎“IST”不在可用的時區 ID 中,您可以使用以下方法檢查列表:TimeZone.getAvailableIDs()。 您可以嘗試使用“亞洲/加爾各答”。

        pstFormat.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));

暫無
暫無

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

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