20

我想将 Date 对象保存为可读字符串(例如 22/10/2009 21:13:14),该字符串也可解析回 Date 对象。

我已经尝试了很多东西,我能找到的最好的方法是使用 DateFormater 进行解析和格式化,但它有一个挫折。当您格式化日期时,您会丢失秒信息。我试图找出是否有一个选项来格式化它并显示秒数(更好的是毫秒级别,因为这是 Date 对象允许你拥有的分辨率),但我想不到。

有任何想法吗?

4

6 回答 6

47

看看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
于 2009-09-23T20:52:35.753 回答
5

SimpleDateFormat可以基于一个非常简单的模式系统格式化和解析日期,包括秒甚至毫秒。

于 2009-09-23T20:52:40.493 回答
4

其他答案都很好。

但是当做这种事情时,选择一种在编码为字符串时正确排序的格式......“yyyy/MM/dd HH:mm:ss”很好。当软件工程师选择一种不能以明显、方便的方式排序的日期格式时,我总是感到惊讶。

你会在未来的某个遥远的时刻为你的开发者伙伴们省去很多痛苦——把它想象成好的业力:-)

于 2011-04-18T14:39:39.077 回答
3

ISO 8601

使用ISO 8601格式。

  • 它很灵活,它包括秒和秒的分数(如果有),但如果它们为 0,你也可以将它们排除在外。
  • 它是标准的,因此越来越多的工具对其进行格式化和解析。非常适合用于存储或数据交换的序列化。
  • 就像2009-10-22T21:13:14,我应该说它非常易于人类阅读(尽管T中间表示时间部分开始的部分一开始可能会觉得不寻常)。
  • 只要年份在 1000 到 9999 的四位数范围内,字符串就会按照 mikera 在另一个答案中的要求正确排序。
  • 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()了一次,所以这应该不足为奇。

于 2018-01-18T17:17:03.077 回答
2

有点跑题了,但我总觉得有必要提醒人们 DateFormat 和 SimpleDateFormat 不是线程安全的!Sun 文档清楚地说明了这一点,但我一直在野外寻找代码,人们将 SimpleDateFormat 粘贴在静态...

于 2009-09-24T09:19:06.680 回答
2

如果您想简单一点,并且避免制作大多数其他答案所涉及的自己的 DateFormat,您可以利用java.time.Instant中的默认格式:

(new Date()).toInstant.toString();
于 2018-02-09T21:36:30.980 回答