我想将Date对象保存为可读字符串(例如22/10/2009 21:13:14),该字符串也可以解析为Date对象。
我已经尝试了很多东西,我能找到的最好的东西是使用DateFormater进行解析和格式化,但它有一个挫折。格式化日期时,您将丢失秒信息。我试图找到是否有一个选项来格式化它并显示秒数(更好的是毫秒级别,因为这是Date对象允许的分辨率)但是我做得很短。
有什么想法吗?
答案 0 :(得分:39)
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
答案 1 :(得分:4)
SimpleDateFormat
可以根据包含秒和偶数毫秒的非常简单的模式系统来格式化和解析日期。
答案 2 :(得分:4)
其他答案都很好。
但是当做这种事情时请选择正确排序的格式,当编码为字符串时......“yyyy / MM / dd HH:mm: ss“很好。当软件工程师选择一种不以明显,方便的方式排序的日期格式时,它总是令我惊讶。
你将在未来的某个遥远的地方拯救你的同事们很多痛苦 - 把它想象成好的业力: - )
答案 3 :(得分:2)
有点偏离主题,但我总觉得有必要提醒人们DateFormat和SimpleDateFormat不是线程安全的! Sun文档清楚地说明了这一点,但是我一直在野外找到代码,人们在静态中使用SimpleDateFormat ......
答案 4 :(得分:1)
使用ISO 8601格式。
2009-10-22T21:13:14
,我应该说它非常易读(虽然中间的T
表示时间的开始部分起初可能会感觉不寻常。)java.time
的类,现代Java日期和时间API,以及Joda Time的类将ISO 8601解析为默认值,即没有任何显式格式化程序,并从其{生成相同的格式{1}}方法。使用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()
,所以这不应该让人感到惊讶。
答案 5 :(得分:0)
如果你想做一点点简单,并且免于制作你自己的大多数其他Answers所涉及的DateFormat,你可以利用java.time.Instant中的默认格式:
(new Date()).toInstant.toString();