我需要大量地将 java.util.Date
转换为 yyyy-MM-dd
格式的 String
。
我刚刚迁移到 Java 8,想知道如何正确执行它。 我使用 Java 7 的解决方案是这样的:
DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT_PATTERN)
DATE_FORMATTER.print(value.getTime())
它帮助我避免创建大量冗余对象。
所以现在当我转移到 java 8 时我想正确地重写它但是:
LocalDate.fromDateFields(value).toString())
每次都创建新的 LocalDate
对象,这给 GC 带来了很多工作。
有什么办法可以解决我的问题吗? 性能和线程安全非常重要。
经过一些测试后,我发现即使创建新的对象构造:
new SimpleDateFormat("yyyy-MM-dd")).format(value))
整个主题最快。
最佳答案
下面只有将旧 Date 转换为新 LocalDate 的开销。
Date date = new Date();
LocalDate ldate = LocalDate.from(date.toInstant().atZone(ZoneOffset.UTC));
String s = DateTimeFormatter.ISO_DATE.format(ldate); // uuuu-MM-dd
不过,DateTimeFormatters 确实是线程安全的,因此每次调用都会多一个实例化。
附言
我添加了 .atZone(ZoneOffset.UTC)
因为报告了异常,@Flown 的解决方案:指定区域。由于 Date
不一定用于 UTC 日期,因此可能会使用另一个。
关于java - 将 java.util.Date 转换为 yyyy-MM-dd 格式的字符串,而无需创建大量对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52870774/