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

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

我刚刚转移到 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))

这个话题最快。


慕森王
浏览 155回答 3
3回答

一只名叫tom的猫

以下仅具有将旧 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 日期,因此可能会使用另一个日期。

隔江千里

使用 SimpleDateFormat 格式化日期。注意,SDF不是 THREAD-SAFE,它可能并不重要,但请记住这一点。例如:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");System.out.println((sdf.format(new Date())).toString());

慕姐4208626

从性能的角度来看,我没有确切的数字,但我会使用Java 8 Time API来解决这个问题。在您的特殊情况下,我将使用以下语句:LocalDate.now().format(DateTimeFormatter.ISO_DATE);编辑: 对于这个解决方案是从java.util.Date到java.time.LocalDate需要的转换!new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java