Java中人类可读和可解析的日期格式

时间:2009-09-23 20:49:10

标签: java datetime date date-format

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

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

有什么想法吗?

6 个答案:

答案 0 :(得分:39)

查看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

答案 1 :(得分:4)

SimpleDateFormat可以根据包含秒和偶数毫秒的非常简单的模式系统来格式化和解析日期。

答案 2 :(得分:4)

其他答案都很好。

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

你将在未来的某个遥远的地方拯救你的同事们很多痛苦 - 把它想象成好的业力: - )

答案 3 :(得分:2)

有点偏离主题,但我总觉得有必要提醒人们DateFormat和SimpleDateFormat不是线程安全的! Sun文档清楚地说明了这一点,但是我一直在野外找到代码,人们在静态中使用SimpleDateFormat ......

答案 4 :(得分:1)

ISO 8601

使用ISO 8601格式。

  • 它很灵活,如果有的话,它包括秒和秒的一小部分,但如果它们是0,你也可以将它们排除在外。
  • 这是标准的,所以越来越多的工具格式化并解析它。非常适合存储或数据交换的序列化。
  • 它就像2009-10-22T21:13:14,我应该说它非常易读(虽然中间的T表示时间的开始部分起初可能会感觉不寻常。)
  • 正如mikera在another answer中所要求的那样,字符串排序正确,只要这些年份在1000到9999之间的四位数范围内。
  • 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();