gpt4 book ai didi

java - 在 Android 上将 UTC 转换为 EST 不适用于夏令时

转载 作者:行者123 更新时间:2023-12-02 08:53:41 24 4
gpt4 key购买 nike

我一直在尝试将本地时间 (EST) 转换为 UTC,反之亦然。因此,我提供了一个时间选择器,用户选择时间,我将其转换为 UTC 并发送到服务器。代码如下:

        val cal = Calendar.getInstance()
cal.set(Calendar.HOUR_OF_DAY, mHour) //mHour = 15
cal.set(Calendar.MINUTE, mMinute) //mMinute = 00
cal.set(Calendar.SECOND, 0)
val formatter = SimpleDateFormat("HH:mm:ss")
formatter.timeZone = TimeZone.getTimeZone("UTC")
val cutOffTime = formatter.format(cal.time) //this gives 19:00:00 which is correct

考虑夏令时后,上述 cutOffTime 输出是正确的,因为 15:00 EST 是 19:00 UTC。

现在,我从服务器获取相同的 cutOffTime,将其转换为本地(EST)并显示。代码如下:

        val cutOffTime = jsonObject.get("cutOffTime").getAsString())  //value is 19:00:00
var cutoffTime: Time? = null
val format = SimpleDateFormat("hh:mm:ss")
format.timeZone = TimeZone.getTimeZone("UTC")
cutoffTime = Time(format.parse(cutOffTime).time)

//cutoffTime has value 14:00 which is strange, it should be 15:00

所以,上面代码中的 cutoffTime 值为 14:00,这很奇怪,它应该是 15:00。请注意,此代码在 2020 年 3 月 8 日夏令时之前有效。知道我做错了什么吗?

最佳答案

请不要使用旧的且设计不当的 java api 来获取日期和时间。使用新的java.time API。它更加强大并且更好用。

这里是一个关于如何使用 java.time 执行代码的示例:

int mHour = 15;
int mMinute = 0;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");

ZonedDateTime toFormat = LocalDateTime
.now() // Current date and time.
.withHour(mHour).withMinute(mMinute).withSecond(0) // Change hour, minute and second like in your example.
.truncatedTo(ChronoUnit.SECONDS) // Throw away milliseconds and nanoseconds.
.atZone(ZoneOffset.UTC); // Say that the time is located at UTC+0.

String formatted = formatter
.withZone(ZoneId.of("America/New_York")) // Create a new formatter that formats toFormat to the local time America/New_York.
.format(toFormat);

System.out.println(formatted); // Gives 11:00:00 on my machine now. America/New_York is either UTC-5 or UTC-4.

ZonedDateTime parsed = LocalTime
.parse(formatted, formatter) // Parse the String. The result is an instance of LocalTime.
.atDate(LocalDate.now(ZoneId.of("America/New_York"))) // Add the date values which are those of the current local date at America/New_York.
.atZone(ZoneId.of("America/New_York")); // Create a ZonedDateTime of the LocalDateTime to explicitly define the zone.

Instant pointInTimeA = parsed.toInstant();
Instant pointInTimeB = toFormat.toInstant();

System.out.println(pointInTimeA.equals(pointInTimeB)); // Gives true because both describe the same point in time as they should.

最大的好处是 API 将为您处理有关夏季和冬季的所有事情。已阅读here有关 EST 以及为什么不应使用它的信息。

您面临的问题可能是由于您在一个格式化程序中使用了 HH 而在另一个格式化程序中使用了 hh。它们相同。已阅读here关于格式化和解析模式

关于java - 在 Android 上将 UTC 转换为 EST 不适用于夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60624031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com