繁体   English   中英

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

[英]Human readable and parsable date format in Java

我想将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”很好。 当软件工程师选择一种不以明显,方便的方式排序的日期格式时,它总是令我惊讶。

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

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

ISO 8601

使用ISO 8601格式。

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

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

(new Date()).toInstant.toString();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM