Java 将UTC转换为EST在Android上不适用于日光节约

Java 将UTC转换为EST在Android上不适用于日光节约,java,android,kotlin,dst,Java,Android,Kotlin,Dst,我一直在尝试将当地时间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(Cale

我一直在尝试将当地时间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
        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

上述截止时间的输出是正确的,因为在考虑日光节约后,美国东部时间15:00是UTC 19:00

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

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

所以,上面代码中的截止时间的值是14:00,这很奇怪,应该是15:00。
请注意,该代码在2020年3月8日日间储蓄之前生效。知道我做错了什么吗?

请不要在日期和时间上使用设计糟糕的旧java api。使用新的api。它更健壮,使用起来也更好

下面是一个关于如何使用以下代码的示例:

int mHour=15; int mMinute=0; DateTimeFormatter formatter=DateTimeFormatter.of模式hh:mm:ss; ZonedDateTime-toFormat=LocalDateTime .现在//当前日期和时间。 .withHourmHour.withMinutemMinute.withSecond0//更改小时、分钟和秒,如示例中所示。 .truncatedToChronoUnit.SECONDS//丢弃毫秒和纳秒。 .atZoneZoneOffset.UTC;//假设时间位于UTC+0。 字符串格式化=格式化程序 .withZoneZoneId.ofAmerica/New\York//创建一个新的格式化程序,该格式化程序将格式化为本地时间America/New\York。 .格式化格式; System.out.printlnformated;//现在在我的机器上显示11:00:00。美国/纽约是UTC-5或UTC-4。 已解析的ZonedDateTime=LocalTime .parseformatted,格式化程序//解析字符串。结果是LocalTime的一个实例。 .atDateLocalDate.nowZoneId.ofAmerica/New_York//添加日期值,这些值是美国/纽约当前本地日期的值。 .Atzonezonezid.ofAmerica/New_York;//创建LocalDateTime的ZonedDateTime以显式定义区域。 瞬时点intimea=parsed.toInstant; 瞬时点intimeb=toFormat.toInstant; System.out.printlnpointInTimeA.equalspointInTimeB;//之所以为真,是因为两者都描述了它们应该描述的相同时间点。 最大的好处是,api将为您处理夏季和冬季的所有事务。已经阅读了有关EST的信息以及为什么不应该使用它


您面临的问题可能是由于您在一个格式化程序中使用了HH,而在另一个格式化程序中使用了HH。这些不一样。我已经阅读了有关格式化和解析模式的内容。

我最终得到了以下解决方案。我从服务器知道字符串的格式,所以我将其拆分。我不想使用新的时间API,因为它可以从API级别26开始使用

                val cutOffString = jsonObject.get("cutOffTime").getAsString() //UTC date 19:00:00 from server

                val cal = Calendar.getInstance()
                cal.set(Calendar.HOUR_OF_DAY, cutOffString.split(":")[0].toInt())
                cal.set(Calendar.MINUTE, cutOffString.split(":")[1].toInt())
                cal.set(Calendar.SECOND, 0)
                cal.timeZone = TimeZone.getTimeZone("UTC")

                val cutoffTime: Time = Time(cal.time.time) //15:00:00


谢谢回复,我会试试这个。我尝试在两个格式化程序中使用HH。问题仍然存在。此外,在API级别26中添加了java.time。我的最低API级别是21。还有别的解决办法吗?看看,这看起来和我有关。无论如何,我强烈建议您使用新的api。像这样的问题恰恰是旧api的弱点。您应该仔细阅读有关日光节约的旧api文档。问题很可能就是因为这个。