在 Java 中将日期格式 "EEE MMM dd HH:mm:ss zzzz yyyy" 转换为 "yyyy-MM-dd'T'HH:mm:ss"

Convert date fomat "EEE MMM dd HH:mm:ss zzzz yyyy" to "yyyy-MM-dd'T'HH:mm:ss" in Java

我有代码优化问题。目前我正在使用 java LocalDateTime 转换这两种格式。但它需要大约 80 毫秒 - 110 毫秒。这也增加了我的响应时间。有没有更快的替代方法来做到这一点??

这是我的代码:

value= Tue Jan 01 00:19:32 CET 1901

begindate = 1901-01-01T00:19:32

private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern
("EEE MMM dd HH:mm:ss zzz yyyy",Locale.ENGLISH);

LocalDateTime beginDate = LocalDateTime.parse(value, formatter);

String Isoformat = beginDate.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)


编辑:Jon Skeet 的评论和最后你自己给出的答案:第一次解析字符串时,JVM 需要包含时区数据库和语言环境数据加载以解析 CET(或字符串中的其他时区缩写)。这需要时间。下次这些数据已经加载,所以解析很快。

如果在程序启动时您有时间进行一些时区操作以便加载数据,则可以缩短第一个字符串的解析时间。您可以尝试 ZoneId.systemDefault()ZoneId.systemDefault().getDisplayName(TextStyle.SHORT, Locale.ENGLISH) 或简单地解析(硬编码)字符串,如数据库中的字符串。

原答案:更改数据库架构以将日期和时间存储为timestamp with time zonedatetime。这将使您免于解析。 (如果您的 table 中已经有数据,当然,转换它需要时间,但这只有一次,并且不会在用户等待响应时发生。)

如果您不能更改数据库架构,这里有一个更直接的问题答案。这是丑陋的代码,因为它是为优化而编写的,所以只有在不得已的情况下才使用它。

private static DateTimeFormatter monthFormatter
        = DateTimeFormatter.ofPattern("MMM", Locale.ROOT);

    int m = Month.from(monthFormatter.parse(value.subSequence(4, 7))).getValue();
    if (m < 10) {
        return value.substring(value.length() - 4) + "-0" + m + '-' + value.substring(8, 10) + 'T' + value.substring(11, 19); 
    } else {
        return value.substring(value.length() - 4) + '-' + m + '-' + value.substring(8, 10) + 'T' + value.substring(11, 19); 
    }

在我使用了 10 年的计算机上,这将每次转换的时间从 1.78 毫秒减少到 0.73 毫秒,测量结果为 System.nanoTime() 100 次转换。与您的代码相比减少了 59%。

如果您自己 HashMap 查找月份缩写,而不是使用 DateTimeFormatter

,您可能会得到进一步减少