将ZonedDateTime格式化得到的uuuu-MM-dd字符串转换为格式一致的java.util.Date
问题描述
我使用ZonedDateTime获取当前日期时间,由于不需要时间部分,将其按照uuuu-MM-dd格式转换为了类似2021-08-23的字符串,相关代码如下:
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.systemDefault()); DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu-MM-dd" ); String date_string = zdt.format(formatter); System.out.println(date_string);//2021-08-23
现在我需要将2021-08-23格式的字符串转换为java.util.Date类型,且希望日期的展示效果和原字符串完全一致。我尝试了如下代码:
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = formatter1.parse(date_string);
但转换得到的Date输出格式为Mon Aug 23 00:00:00 EEST 2021,包含了星期、月份英文名称和时区信息,不符合预期。请问如何实现字符串到Date的转换,同时保留uuuu-MM-dd的展示格式?
解答
首先要明确核心逻辑:java.util.Date本身只是对Unix时间戳的封装,不存储任何展示格式相关的信息。你直接打印Date对象时看到的格式,是它自带的toString()方法的固定输出规则,和你用什么规则解析生成这个Date对象完全无关,不可能做到让Date对象本身自带uuuu-MM-dd格式。
你要实现对应展示效果,只需要在需要输出Date的时候,再用日期格式化工具转一次即可,你的解析逻辑本身是正确的,不需要修改:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 原有解析逻辑 Date date = sdf.parse(date_string); // 输出时用同一个格式化工具处理就能得到目标格式 System.out.println(sdf.format(date)); // 输出结果为 2021-08-23
如果你使用的是Java 8及以上版本,更推荐直接用java.time包下的类完成操作,避免SimpleDateFormat线程不安全的问题:
// 字符串转LocalDate LocalDate localDate = LocalDate.parse(date_string, DateTimeFormatter.ofPattern("uuuu-MM-dd")); // 如果确实需要用到java.util.Date可以再转换 Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); // 输出时格式化 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd"); System.out.println(formatter.format(localDate)); // 输出结果为 2021-08-23
内容的提问来源于stack exchange,提问作者JohnnySmith88
相关产品推荐
相关产品推荐

