繁体   English   中英

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

[英]How to convert string to unix epoch milliseconds without creating local date time objects

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

毫秒和纳秒部分的长度可以在 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();

上面的代码最终创建了许多本地日期时间对象 && Instant Object,我需要在低延迟应用程序中避免这种情况。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM