为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2021-11-24 18:30:31
我需要转换java.util.Date到String的yyyy-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))这个话题最快。
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-11-24
?
隔江千里

TA贡献1906条经验 获得超10个赞

使用 SimpleDateFormat 格式化日期。


注意,SDF不是 THREAD-SAFE,它可能并不重要,但请记住这一点。


例如:


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

System.out.println((sdf.format(new Date())).toString());


查看完整回答
反对 回复 2021-11-24
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

从性能的角度来看,我没有确切的数字,但我会使用Java 8 Time API来解决这个问题。在您的特殊情况下,我将使用以下语句:

LocalDate.now().format(DateTimeFormatter.ISO_DATE);

编辑: 对于这个解决方案是从java.util.Datejava.time.LocalDate需要的转换!

new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();


查看完整回答
反对 回复 2021-11-24
  • 3 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信