Java yyyy-MM-dd和#x27之间的日期格式差异;T';HH:mm:ss和yyyy-mm-dd';T';HH:mm:ssXXX
我试图使用以下两种格式解析日期Java yyyy-MM-dd和#x27之间的日期格式差异;T';HH:mm:ss和yyyy-mm-dd';T';HH:mm:ssXXX,java,date-format,simpledateformat,date-formatting,Java,Date Format,Simpledateformat,Date Formatting,我试图使用以下两种格式解析日期2014-12-03T10:05:59.5646+08:00: yyyy-MM-dd'HH:MM:ss yyyy-MM-dd'HH:MM:ssXXX 当我使用yyyy-MM-dd'T'HH:MM:ss解析时,它工作正常,但当我解析yyy-MM-dd'T'HH:MM:ssXXX时,会引发一个ParseException 哪种格式是解析日期的正确格式?这两种格式之间到底有什么区别 注意:我不能使用Joda:(使用此格式yyyy-MM-dd'HH:MM:ss.SSSS
2014-12-03T10:05:59.5646+08:00
:
yyyy-MM-dd'HH:MM:ss
yyyy-MM-dd'HH:MM:ssXXX
yyyy-MM-dd'T'HH:MM:ss
解析时,它工作正常,但当我解析yyy-MM-dd'T'HH:MM:ssXXX
时,会引发一个ParseException
哪种格式是解析日期的正确格式?这两种格式之间到底有什么区别
注意:我不能使用Joda:(使用此格式
yyyy-MM-dd'HH:MM:ss.SSSSX
来自API
使用:
输出:
Wed Dec 03 03:06:04 CET 2014
这些是有效的格式:
yyyy-MM-dd'T'HH:mm:ss.SSSZ >>> e.g.: 2001-07-04T12:08:56.235-0700
yyyy-MM-dd'T'HH:mm:ss.SSSXXX >>> e.g.: 2001-07-04T12:08:56.235-07:00
编辑:顺便说一句,“X”指的是(ISO 8601时区) 当我使用
yyyy-MM-dd'T'HH:MM:ss进行解析时,它工作得很好,但是当我
parseyyyy-MM-dd'T'HH:MM:ssXXX
将引发一个ParseException
哪种格式是解析日期的正确格式?确切的格式是什么
这两种格式之间的区别是什么
让我们先看看yyyy-MM-dd'HH:MM:ss
:
从中检查以下行(强调矿山):
解析给定字符串开头的文本以生成日期。
该方法不能使用给定字符串的整个文本
因此,基本上,yyyy-MM-dd'T'HH:MM:ss
格式只考虑到了2014-12-03T10:05:59
,忽略了秒和时区偏移信息的分数
yyyy-MM-dd'HH:MM:ssXXX
有什么问题?
在此格式中,您已正确放置时区偏移的符号,但在几分之一秒的时间内丢失了这些符号
使用SimpleDataFormat
解析它的正确格式是什么?
简短的回答:无
详细回答:SimpleDataFormat
无法处理超过毫秒的精度(即
之后的3位数字)正确,因此没有一种格式能够正确解析它。唯一正确的方法是将
后面的数字保持在三位数以内,例如2014-12-03T10:05:59.564+08:00
,2014-12-03T10:05:59.56+08:00
等。让我们看看SimpleDateFormat
将如何解析2014-12-03T10:05:59.5646+08:00
错误
SimpleDataFormat
将
之后的数字视为毫秒数(而不是现代日期时间API所考虑的分秒数)。因此,计算如下:
5646 milliseconds = 5 seconds + 646 milliseconds
2014-12-03T10:05:59 + 5 seconds + 646 milliseconds = 2014-12-03T10:06:04.646
让我们使用以下代码对其进行验证:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) throws ParseException {
String strDateTime = "2014-12-03T10:05:59.5646+08:00";
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date date = sdf.parse(strDateTime);
sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
System.out.println(sdf.format(date));
}
}
输出:
2014-12-03T10:06:04.646+08:00
import java.time.OffsetDateTime;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.parse("2014-12-03T10:05:59.5646+08:00");
System.out.println(odt);
}
}
2014-12-03T10:05:59.564600+08:00
java.time
随着2014年3月Java SE 8的发布,过时且容易出错的旧版日期-时间API(Java.util
Date-Time类型及其格式类型,SimpleDateFormat
等)被Java.Time
所取代。强烈建议停止使用旧版API并切换到此新API
解决方案使用java.time
,现代API:
2014-12-03T10:06:04.646+08:00
import java.time.OffsetDateTime;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.parse("2014-12-03T10:05:59.5646+08:00");
System.out.println(odt);
}
}
2014-12-03T10:05:59.564600+08:00
输出:
2014-12-03T10:06:04.646+08:00
import java.time.OffsetDateTime;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.parse("2014-12-03T10:05:59.5646+08:00");
System.out.println(odt);
}
}
2014-12-03T10:05:59.564600+08:00
这不是很酷吗?
现代日期时间API基于并且不需要显式使用DateTimeFormatter
对象,只要日期时间字符串符合ISO 8601标准
顺便说一句,无论出于何种原因,如果您需要将此对象的OffsetDateTime
转换为java.util.Date
的对象,您可以按如下操作:
Date date = Date.from(odt.toInstant());
了解更多关于java.time
、来自的*
*无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用哪个backport将大部分Java.time功能移植到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。
您在哪里读到应该使用XXX
来表示毫秒?我在SimpleDataFormat
javadoc中没有看到它。第一个示例无效,因为tz偏移量没有扩展。我只是在eclipse上运行了它的“今天”它产生了:2015-09-21T17:07:56.450+0300不要使用那种格式。阅读我对第一个答案的评论。@Michael-O a)实际上第一个答案是我的。b) 此代码正在工作,c)您能解释一下您的意思吗?示例无效,因为tz偏移量没有扩展??thanksI没有说这不起作用。格式无效。阅读维基百科。您必须使用基本和扩展的表示。如果以扩展格式写入日期和时间,则必须同时写入tz偏移量。否则输入无效。@Michael-O我不明白你的意思抱歉,实际上我不在乎维基上说什么。。。。有数以百万计的日期格式,并且对某些人来说都是有效的,这就是为什么存在像SimpleDateFormat
这样的解析器。因此,请更清楚,放一些链接或添加您自己的标准答案,因为您似乎比我们更了解这一点。。。