java - 将 java.util.Date 转换为 yyyy-MM-dd 格式的字符串,而无需创建大量对象

标签 java java-8 java-time

我需要大量地将 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/

相关文章:

Java Instant 的 bug? `DateTimeException: Invalid value for Year`

java - 打印tomcat版本和路径

java - 从 Java 异步调用 .NET Web 服务

java - 如何在多个 mongo 存储库上使用 QueryDSL?

java - 使用基于 Java Key Store 别名的单个证书

Java 流 : Collect not combining all values

带有 Java 8 的 Tomcat 6 给出 JSP 编译错误

java - JFreeChart:使用 java.time.LocalDate 或 java.time.LocalDateTime 创建图表

java - 列表 foreach 方法

java - 使用 DateTimeFormatter 显示短时区名称