Java 如何在不创建本地日期时间对象的情况下将字符串转换为unix历元毫秒

Java 如何在不创建本地日期时间对象的情况下将字符串转换为unix历元毫秒,java,Java,我的应用程序可以接收以下任意格式的日期时间信息: “yyyymmdd HH:mm:ss.毫秒” “yyyymmdd HH:mm:ss.纳秒” 毫秒和纳秒部分的长度可以在0-9之间变化 例如: "20200616 00:00:00.0" “20200701 02:43:01.47456884” 我正在使用以下代码将传入转换为unix epoc millis: private static final DateTimeFormatter TIMESTAM_FORMATTER = new DateT

我的应用程序可以接收以下任意格式的日期时间信息: “yyyymmdd HH:mm:ss.毫秒” “yyyymmdd HH:mm:ss.纳秒”

毫秒和纳秒部分的长度可以在0-9之间变化

例如: "20200616 00:00:00.0" “20200701 02:43:01.47456884”

我正在使用以下代码将传入转换为unix epoc millis:

 private static final DateTimeFormatter TIMESTAM_FORMATTER = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.BASIC_ISO_DATE).appendLiteral(' ')
            .appendPattern("HH:mm:ss")
            .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
            .toFormatter();
  LocalDateTime localDateTime = LocalDateTime.parse((CharSequence) input, TIMESTAM_FORMATTER );
                Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
                return instant.toEpochMilli();
上面的代码最终创建了许多本地日期时间对象和即时对象,这是我在低延迟应用程序中需要避免的


有没有其他方法可以在每次调用时不创建LocalDatetIme和instant对象的情况下解析此字符串?

我的建议是对部分字符串缓存使用本地日期时间计算的偏移量,并对其余部分进行简单的计算

例如,您可以在应用程序启动时缓存:yyyymmdd的所有值。这意味着您只需计算HH:mm:ss.nanoseconds并将其添加到缓存版本

了解更多有关应用程序的信息可以决定是否缓存yyyymmdd HH,甚至更多。它还可以告知您真正想要缓存的日期范围(尽管从0年到9999年不到400万天)


缓存我建议的部分意味着您不必考虑闰年和月份的不同天数。您还可以使用原始代码作为oracle编写测试,以检查日历中的闰秒和其他异常情况。

请参见您确定是创建对象减慢了应用程序的速度吗?我建议您不要做任何降低代码可读性的事,除非您确定存在问题你的改变将真正解决。解析传入的CharSequence是代价高昂的,而不是该操作的结果最终包装在LocalDateTime对象中。我建议您注意著名的警告…“过早优化是万恶之源”…如果您决定真正需要的是优化解析本身,那么我喜欢@ChrisFoley的想法。如果您的日期往往都在最后几天,或者它们是连续的,这样您就可以缓存前一个值的日期部分,就像Chris解释的那样,然后在需要解析的下一个值中查找相同的日期,那么这一功能尤其强大。有很多窍门要做,但即便如此,我还是建议你在没有证据证明某个问题存在的情况下,不要认定自己有问题。在解决问题之前先证明问题存在。我下面的回答是从表面上看问题中所述的延迟问题。当然,如果您还没有分析过您的应用程序,那么这是第一步。谢谢Chris。我会尝试这样做,如果你能分享的话,我很想听听它对绩效的影响。