簡體   English   中英

我如何根據土耳其時區獲取 Calendar.getInstance()

[英]how can i get Calendar.getInstance() based on Turkey timezone

我正在開發一個 android 應用程序。 我應該怎么做才能根據土耳其當地時間獲取當前時間?

val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+3"))

結果是:

2020-08-25T18:16:30

但是這個網站的結果是不同的: https : //www.timeanddate.com/worldclock/turkey/istanbul

2020-08-25T16:46:30

使用以下代碼片段打印輸出:

DebugHelper.info("one now => ${now.getDisplayMonthNameDayTime(FULL_PATTERN)}")

擴展功能:

const val FULL_PATTERN = "yyyy-MM-dd'T'HH:mm:ss"

fun Calendar.getDisplayMonthNameDayTime(pattern: String = "dd MMM , HH:mm ") = SimpleDateFormat(
    pattern,
    Locale.getDefault()
).format(time).toUpperCase(Locale.getDefault())

如果您想使用現代且不那么麻煩的 API,請使用java.time ,尤其是java.time.ZonedDateTime

請參閱此最小示例:

public static void main(String[] args) {
    ZonedDateTime istanbulDateTime = ZonedDateTime.now(ZoneId.of("Europe/Istanbul"));
    System.out.println(istanbulDateTime);
}

輸出(幾秒鍾前):

2020-08-25T16:32:56.069+03:00[Europe/Istanbul]

作為替代方案,也有ZoneId.of("Asia/Istanbul") ,但值僅在大陸的描述中有所不同。 我想只是口味問題。

編輯
在您編輯之后,我意識到您不依賴於時區,而是依賴於偏移量。 這帶來了java.time另一個替代方案,即java.time.OffsetDateTime

為了完整起見,這里有一個可能的解決方案,它只需要一個ZoneOffset而不需要通過String提供一個區域:

public static void main(String[] args) {
    OffsetDateTime utcPlusThreeDateTime = OffsetDateTime.now(ZoneOffset.ofHours(3));
    System.out.println(utcPlusThreeDateTime);
}

哪個輸出(幾秒鍾前)

2020-08-25T16:53:14.490+03:00

...是的,由於Android 中API 脫糖,您可以將它與合適的 gradle 插件一起使用。

解決方案

使用ZoneId.of("Asia/Istanbul")ZonedDateTime的 ZonedDateTime,現代 Java 日期和時間 API,如 deHaar 的回答所示。

問題

你的問題在這一行:

).format(time).toUpperCase(Locale.getDefault())

time為您提供Calendar對象的時間作為Date (另一個設計不佳且過時的類,我們不應再使用它)。 Date沒有任何時區,因此Calendar的時區和偏移量信息丟失。 因此,當您格式化此Date ,您使用的是SimpleDateFormat的時區,而不是Calendar的時區。

Calendar的時區是GMT+03:00好吧。 正如其他人所說,您應該更喜歡歐洲/伊斯坦布爾或亞洲/伊斯坦布爾。

鏈接

土耳其在 Java 中存在實時問題...

你需要用 GMT+03 做你自己的 hack

TimeZone.getTimeZone("GMT+03")

代碼:

TimeZone timeZone = TimeZone.getTimeZone("GMT+03");
Calendar calendar = Calendar.getInstance(timeZone);

暫無
暫無

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

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