Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的可读和可解析的日期格式_Java_Datetime_Date_Date Format - Fatal编程技术网

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

Java中的可读和可解析的日期格式,java,datetime,date,date-format,Java,Datetime,Date,Date Format,我想将日期对象保存为可读字符串(例如22/10/2009 21:13:14),该字符串也可以解析回日期对象 我尝试过很多方法,我能找到的最好的方法就是使用DateFormatter进行解析和格式化,但它遇到了一个挫折。格式化日期时,会丢失秒数信息。我试图找到是否有一个选项来格式化它并显示秒数(最好是毫秒级,因为这是Date对象允许的分辨率),但我没有找到 有什么想法吗?看看 可以基于一个非常简单的模式系统(包括秒甚至毫秒)格式化和解析日期。有点离题,但我总是觉得有必要提醒人们DateFormat

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

我尝试过很多方法,我能找到的最好的方法就是使用DateFormatter进行解析和格式化,但它遇到了一个挫折。格式化日期时,会丢失秒数信息。我试图找到是否有一个选项来格式化它并显示秒数(最好是毫秒级,因为这是Date对象允许的分辨率),但我没有找到

有什么想法吗?

看看


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

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

其他答案都很好

但是,在执行此类操作时,请选择一种格式,当编码为字符串时,可以正确排序。。。。“yyyy/MM/dd HH:MM:ss”可以。当软件工程师选择了一种不以明显、方便的方式排序的日期格式时,我总是感到惊讶

在将来的某个遥远的时刻,您将为您的开发伙伴节省大量的痛苦-将其视为良好的因果报应:-)

ISO 8601 使用格式

  • 它是灵活的,它包括秒和分数秒(如果有的话),但如果它们是0,也可以省略它们
  • 它是标准的,所以越来越多的工具格式化和解析它。非常适合存储或数据交换的序列化
  • <> LI>就像 2009—10-22T21:13:14,我应该说它是相当人类可读的(虽然在时间段的开始时, t>代码>可能会觉得不寻常)。
  • 按照mikera在中的要求,只要年份在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()
call再次隐式调用
toString()
,因此这并不奇怪。

如果您想做得简单一点,不必像大多数其他答案那样制作自己的日期格式,您可以利用以下默认格式:


这就是为什么每个人都应该用乔达的时间来代替,省得自己头疼:)我完全同意。另一方面,我希望Sun能够修复这些类,因此,如果没有其他问题的话,我就不必再坐在那里学习另一个“并发性经验教训”——与人一起提醒我。(哦,讽刺的是……我刚才在StackOverflow上做了完全相同的事情:-)Oracle(收购Sun的公司)已经修复了它。现代java日期和时间API java.time的类是线程安全的。忘记所有关于旧的
SimpleDateFormat
@Unihedron更新了链接。审阅者,请注意,这不是一个仅链接的答案-答案在没有链接的情况下仍然有意义,并且链接本身指向官方文档。“yyy/dd/MM”排序不正确。把2015/21/10, 2015/20/11和2015/22/11排序为2015/20/11, 2015/21/10,2015/22/11作为字符串。对不起,我的意思是YYYY/MM/DD。当这个答案是用2009写的时候,<代码> SimpleDateFormat <代码>就是我们的目的。事实证明,它很麻烦,幸运的是在2014年被
java.time
、现代java日期和时间API及其
DateTimeFormatter
类所取代。我建议您不要再使用
SimpleDateFormat
。问题是转换日期对象,如果我想使用您的代码,那么我需要将日期转换为LocalDateTime,我该怎么做?谢谢@Royhabehan,谢谢您的关注。给定一个老式的
Date
do
String readableString=yourDate.toInstant().toString()和相反的方式
dateparsedback=Date.from(Instant.parse(readableString))。字符串最后将有
Z
,它表示UTC。在这种情况下,不要使用
LocalDateTime
2009-10-22T21:13:14
2009-10-22T21:13:14
(new Date()).toInstant.toString();