Java 中人类可读和可解析的日期格式
-
13-09-2019 - |
题
我想将 Date 对象保存为可读字符串(例如 22/10/2009 21:13:14),该字符串也可以解析回 Date 对象。
我尝试了很多方法,我能找到的最好的方法是使用 DateFormater 进行解析和格式化,但它有一个挫折。当您格式化日期时,您会丢失秒信息。我尝试查找是否有一个选项可以对其进行格式化并显示秒数(最好是毫秒级别,因为这是 Date 对象允许您拥有的分辨率),但我没有找到。
有任何想法吗?
解决方案
看一看 java.text.SimpleDateFormat中
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS");
Date dt = new Date();
String S = sdf.format(dt); // formats to 09/23/2009 13:53:28.238
Date dt2 = sdf.parse(S); // parses back
其他提示
SimpleDateFormat
可以格式化和解析基于一个非常简单的图案的系统,包括第二和甚至毫秒上的日期。
其他答案都是很好的。
但做这种事情时,请挑选的格式正确排序:当作为字符串编码....“YYYY / MM / DD HH:MM: SS”是好的。它总是astounds我,当软件工程师挑不中明显的,方便的方式进行排序的日期格式。
您会在未来的某个遥远的点保存你的同胞开发商很多痛苦的 - 认为它是好人缘: - )
一个有点偏离主题,但我总觉得有必要提醒的是,日期格式和SimpleDateFormat的是不是线程安全的人! Sun文档中明确指出这一点,但我一直寻找的代码在野外,人们在静态贴的SimpleDateFormat ...
ISO 8601
使用 ISO 8601 格式。
- 它很灵活,它包括秒和秒的小数部分(如果有的话),但如果它们是 0,你也可以将它们省略。
- 它是标准的,因此越来越多的工具对其进行格式化和解析。非常适合存储或数据交换的序列化。
- 它就像
2009-10-22T21:13:14
, ,我应该说它非常易于人类阅读(尽管T
中间表示时间开始的部分一开始可能会感觉不寻常)。 - 字符串正确排序,正如 mikera 中所要求的那样 另一个答案, ,只要年份在 1000 到 9999 的四位数范围内。
- 的班级
java.time
, 、现代 Java 日期和时间 API 以及 Joda Time 的 API 将 ISO 8601 解析为默认值,即没有任何显式格式化程序,并从它们生成相同的格式toString
方法。
一个简单的使用演示 java.time
:
LocalDateTime dateTime = LocalDateTime.of(2009, 10, 22, 21, 13, 14);
String readableString = dateTime.toString();
System.out.println(readableString);
LocalDateTime parsedBack = LocalDateTime.parse(readableString);
System.out.println(parsedBack);
这会打印两行相同的行:
2009-10-22T21:13:14
2009-10-22T21:13:14
后者 System.out.println()
隐式调用 toString()
再次,所以这不应该令人惊讶。
如果你想要做的更简单一点,从制作自己的日期格式,大多数其他的答案涉及幸免,你可以充分利用其在的 java.time.Instant :
(new Date()).toInstant.toString();