Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 yyyy-MM-dd和#x27之间的日期格式差异;T';HH:mm:ss和yyyy-mm-dd';T';HH:mm:ssXXX_Java_Date Format_Simpledateformat_Date Formatting - Fatal编程技术网

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进行解析时,它工作得很好,但是当我
parse
yyyy-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
这样的解析器。因此,请更清楚,放一些链接或添加您自己的标准答案,因为您似乎比我们更了解这一点。。。