将java中的日期格式“eee-mmm-dd hh:mm:ss zzzz-yyyy”转换为“yyyy-mm-dd'hh:mm:ss”

vbkedwbf  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(466)

我有代码优化的问题。目前我正在使用JavaLocalDateTime转换这两种格式。但它需要大约80毫秒-110毫秒。这也增加了我的React时间。有没有其他更快捷的方法??
这是我的密码:

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

zwghvu4y1#

编辑:jonskeet的注解,最后是您自己给出的答案:第一次解析字符串时,需要加载jvm中包含的时区数据库和区域设置数据,以便进行解析 CET (或字符串中的其他时区缩写)。这需要时间。下一次加载这些数据时,解析速度很快。
如果在程序启动时有时间执行一些时区操作以便加载数据,则可以缩短第一个字符串的解析时间。你可以试试 ZoneId.systemDefault() 或者 ZoneId.systemDefault().getDisplayName(TextStyle.SHORT, Locale.ENGLISH) 或者简单地解析一个(硬编码的)字符串,比如数据库中的字符串。
原始答案:更改数据库模式以将日期和时间存储为 timestamp with time zone 或者 datetime . 这将使您免于解析(如果表中已经有数据,转换它当然需要时间,但这只是一次,而且在用户等待响应时不会发生。)
如果您不能更改数据库模式,下面是对您的问题的更直接的答案。它是丑陋的代码,因为它是为优化而写的,所以只能作为最后的手段使用。

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 .

相关问题