[英]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
使用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.