繁体   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