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

2022-09-03 02:06:07

我需要大量转换为格式。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())

每次创建新对象,这给GC带来了很多工作。LocalDate

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

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

new SimpleDateFormat("yyyy-MM-dd")).format(value)) 

整个主题中最快的。


答案 1

以下情况仅具有将旧日期转换为新 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确实是线程安全的,因此每次调用都会有更多的实例化。

附言

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


答案 2

使用 SimpleDateFormat 设置日期格式。

请注意,SDF不是线程安全的,它可能并不重要,但请记住这一点。

例如:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println((sdf.format(new Date())).toString());

链接更多信息。


推荐