我想将 Date 对象保存为可读字符串(例如 22/10/2009 21:13:14),该字符串也可解析回 Date 对象。
我已经尝试了很多东西,我能找到的最好的方法是使用 DateFormater 进行解析和格式化,但它有一个挫折。当您格式化日期时,您会丢失秒信息。我试图找出是否有一个选项来格式化它并显示秒数(更好的是毫秒级别,因为这是 Date 对象允许你拥有的分辨率),但我想不到。
有任何想法吗?
我想将 Date 对象保存为可读字符串(例如 22/10/2009 21:13:14),该字符串也可解析回 Date 对象。
我已经尝试了很多东西,我能找到的最好的方法是使用 DateFormater 进行解析和格式化,但它有一个挫折。当您格式化日期时,您会丢失秒信息。我试图找出是否有一个选项来格式化它并显示秒数(更好的是毫秒级别,因为这是 Date 对象允许你拥有的分辨率),但我想不到。
有任何想法吗?
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”很好。当软件工程师选择一种不能以明显、方便的方式排序的日期格式时,我总是感到惊讶。
你会在未来的某个遥远的时刻为你的开发者伙伴们省去很多痛苦——把它想象成好的业力:-)
使用ISO 8601格式。
2009-10-22T21:13:14
,我应该说它非常易于人类阅读(尽管T
中间表示时间部分开始的部分一开始可能会觉得不寻常)。java.time
现代 Java 日期和时间 API 以及 Joda Time的类将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()
了一次,所以这应该不足为奇。
有点跑题了,但我总觉得有必要提醒人们 DateFormat 和 SimpleDateFormat 不是线程安全的!Sun 文档清楚地说明了这一点,但我一直在野外寻找代码,人们将 SimpleDateFormat 粘贴在静态...
如果您想简单一点,并且避免制作大多数其他答案所涉及的自己的 DateFormat,您可以利用java.time.Instant中的默认格式:
(new Date()).toInstant.toString();