为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 GMT +09:00 转换为本地时间?

如何将 GMT +09:00 转换为本地时间?

明月笑刀无情 2023-02-16 17:14:44
当我打印从服务器获取的日期时,它显示Mon Jun 24 16:15:31 GMT+09:00 2019val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")val date: Date? = formatter.parse(checkedDate) // date from serverval transformedDate = ("${String.format("%02d", date!!.month + 1)}.${String.format("%02d", date!!.date)}.${date.year + 1900}")val title: String? = ("$transformedDate")val longGmtTime = date.timeval mZone = TimeZone.getDefault()val offset = mZone.getOffset(longGmtTime)val longLocalTime = longGmtTime + offset - (9 * HOUR)val localDate = Date() // local datelocalDate.time = longLocalTimeval localFormatTime = formatter.format(localDate)val transformedLocalDate = ("${String.format("%02d", localDate!!.month + 1)}.${String.format("%02d", localDate!!.date)}.${localDate.year + 1900}")它给了我server time: 2019-06-24 16:15:31 -> 06.24.2019, local time(Asia/Seoul)-> 2019-06-25 01:15:30 ->06.25.2019结果。服务器时间和本地时间必须一致。但是当地时间显示在其他地方。有什么问题?
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

有什么问题?

严重问题清单包括:

  • 您正在使用设计糟糕且过时已久的 Java 日期和时间类DateTimeZone并且SimpleDateFormat.

  • 您正在使用已弃用的方法getMonth和类。这些方法跨时区工作不可靠,这是它们被弃用的主要原因。getDategetYearDate

  • 您正在使用加法、减法和乘法手动进行时区转换。日期和时间数学容易出错,您应该始终将其留给经过验证的库方法。

  • 您获得的毫秒计数Date.getTime是自 1970-01-01T00:00:00 UTC 时代以来。这是一个独特的时刻,与时区无关,因此在时区转换的毫秒计数中增加和减少是没有意义的。

  • 当我将 JVM 的默认时区设置为 Asia/Seoul 并假设该时区HOUR为 0(或 0 到 111 范围内的某个值)时,我可以重现您的结果。我假设您想要HOUR表示一小时内的毫秒数,3 600 000(至少通常存在例外)。

  • 您通过连接对 的调用结果来格式化您的日期Strirg.format。最好将格式化留给专门的日期格式化程序。

修复:java.time

   ZoneId serverTimeZone = ZoneId.of("Asia/Seoul");

    DateTimeFormatter serverFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");

    ZoneId clientTimeZone = ZoneId.systemDefault();


    String checkedDate = "2019-06-24 16:15:31";

    ZonedDateTime serverDateTime = LocalDateTime.parse(checkedDate, serverFormatter)

            .atZone(serverTimeZone);

    ZonedDateTime clientDateTime = serverDateTime.withZoneSameInstant(clientTimeZone);

    System.out.println("clientDateTime: " + clientDateTime);

抱歉,我只能编写和运行 Java 代码,我相信你会翻译。由于我的 JVM 时区仍设置为 Asia/Seoul,我得到:

clientDateTime: 2019-06-24T16:15:31+09:00[亚洲/首尔]

服务器时间和客户端时间相同,如您所要求的。相反,如果我保留自己的时区,我会得到:

clientDateTime:2019-06-24T09:15:31+02:00[欧洲/哥本哈根]

所以发生了转换。

格式化日期:

    DateTimeFormatter displayFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
            .withLocale(Locale.forLanguageTag("ko-KR"));    String transformedLocalDate = clientDateTime.format(displayFormatter);
    System.out.println("transformedLocalDate: " + transformedLocalDate);

transformedLocalDate: 2019. 6. 24.

或者,如果您坚持使用 month.date.year:

    DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MM.dd.u");

transformedLocalDate:06.24.2019

进一步的建议是让您的服务器以 ISO 8601 格式提供 UTC 日期时间字符串。这就像2019-06-24T07:15:31Z示例中暂时使用的那样。

问题:我可以在 Android 上将 java.time 与 minSdk API 级别 23 一起使用吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少Java 6

  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。

  • 在 Java 6 和 7 中获得 ThreeTen Backport,现代类的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。

  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。


查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信