将java.util.Date转换为yyyy-MM-dd格式的String,而不创建大量对象

Ole*_*nyk 17 java java-8 java-time

我需要转换java.util.DateStringyyyy-MM-dd格式在一个大的数额.

我刚刚转到java 8并想知道如何正确地做到这一点.我使用Java 7的解决方案如下:

DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT_PATTERN)

DATE_FORMATTER.print(value.getTime())
Run Code Online (Sandbox Code Playgroud)

它帮助我不创建大量冗余对象.

所以现在当我转到java 8时,我想要正确地重写它,但是:

LocalDate.fromDateFields(value).toString())
Run Code Online (Sandbox Code Playgroud)

每次都创建新LocalDate对象,这为GC提供了大量的工作.

有什么方法可以解决我的问题吗?性能和线程安全非常重要.

经过一些测试后,我发现即使创建新的对象构造:

new SimpleDateFormat("yyyy-MM-dd")).format(value)) 
Run Code Online (Sandbox Code Playgroud)

这个话题最快.

Joo*_*gen 8

以下仅具有将旧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
Run Code Online (Sandbox Code Playgroud)

但是,DateTimeFormatters是线程安全的,因此每次调用会有一个实例化.

PS

我添加了.atZone(ZoneOffset.UTC)因为报告的异常和@Flown的解决方案:指定区域.由于Date不一定用于UTC日期,可以使用另一个.