Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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 为什么我会犯错误;“不可剥夺的日期”;来自SimpleDateFormat?_Java_Timestamp_Simpledateformat - Fatal编程技术网

Java 为什么我会犯错误;“不可剥夺的日期”;来自SimpleDateFormat?

Java 为什么我会犯错误;“不可剥夺的日期”;来自SimpleDateFormat?,java,timestamp,simpledateformat,Java,Timestamp,Simpledateformat,我试图将一个没有时区的日期字符串解析为一个有时区的新日期,但我得到了错误: java.text.ParseException:无法解析的日期:“2017-11-17 10:49:39.772” 这是我的代码: String date = "2017-11-17 10:49:39.772 " SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z"); sdf.setTimeZone(TimeZone.ge

我试图将一个没有时区的日期字符串解析为一个有时区的新日期,但我得到了错误:
java.text.ParseException:无法解析的日期:“2017-11-17 10:49:39.772”

这是我的代码:

 String date = "2017-11-17 10:49:39.772 "
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");
 sdf.setTimeZone(TimeZone.getTimeZone("Europe/Amsterdam"));
 sdf.parse(date);  //here´s the error
 return date.getTime();

有什么建议吗?

您在
SimpleDateFormat
中明确表示,您需要在末尾设置时区偏移量(Z参数),但您的字符串缺少偏移量。最后需要类似于
+0000
的内容。

您在
SimpleDataFormat
中明确表示,您需要在末尾使用时区偏移量(参数
Z
),但字符串缺少偏移量。最后需要类似于
+0000
的内容。

如果希望正确解析字符串,它必须与构造函数中提供的SimpleDataFormat模式匹配:

老一套:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");
新行:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ");

如果希望正确解析字符串,则它必须与构造函数中提供的SimpleDataFormat模式匹配:

老一套:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");
新行:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ");

你的问题已经回答了。我只是想贡献你代码的现代版本

java.time

您正在使用过时的长类
SimpleDateFormat
Date
java.time
,现代java日期和时间API(也称为JSR-310)通常更易于使用。在您的特定情况下,代码非常相似:

    String date = "2017-11-17 10:49:39.772 ";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS ");
    ZoneId zid = ZoneId.of("Europe/Amsterdam");
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);
    System.out.println(zdt);
这张照片

2017-11-17T10:49:39.772+01:00[Europe/Amsterdam]
我不需要重复@DarrenW已经说过的内容:当输入字符串以空格结尾且没有时间偏移时,格式模式字符串也应该以空格结尾且没有
Z
,因为
Z
与UTC的偏移相匹配(现在我还是重复了它)

Date
a
zoneDateTime
相反,它有一个时区(顾名思义),因此我认为这可能更适合您的要求

从历元获取毫秒数

这可能是猜测:您的呼叫
date.getTime()
给我的印象是,自1970年1月1日00:00:00 GMT(“纪元”)以来,您一直在追踪毫秒数。如果是,请:

    long millisSinceEpoch = zdt.toInstant().toEpochMilli();
结果是

1510912179772
使用字符串中的时区进行解析

更多的猜测,我不禁想,可能发生的是,您收到了一个日期-时间字符串,该字符串与格式模式字符串匹配,但其中的时区偏移量不正确,您将其剥离,在字符串的末尾留下了悬空空间。如果是这种情况,现代API在解析时只需忽略不正确的偏移量,就可以更轻松、更优雅地处理这种情况:

    String date = "2017-11-17 10:49:39.772 +0000";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS Z");
    ZoneId zid = ZoneId.of("Europe/Amsterdam");
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);
结果是2017-11-17T10:49:39.772+01:00[欧洲/阿姆斯特丹],与上面的第一个片段完全相同
LocalDateTime
是一个没有任何时区或偏移量信息的日期和时间,因此无法通过字符串的不正确偏移量。无论如何,
atZone()
仍然设置正确的时区


另一种方法是直接解析成一个
ZoneDateDate
,然后用ZoneSamelocal()调用它的
,以消除不需要的偏移量。

您的问题已经得到了回答。我只是想贡献你代码的现代版本

java.time

您正在使用过时的长类
SimpleDateFormat
Date
java.time
,现代java日期和时间API(也称为JSR-310)通常更易于使用。在您的特定情况下,代码非常相似:

    String date = "2017-11-17 10:49:39.772 ";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS ");
    ZoneId zid = ZoneId.of("Europe/Amsterdam");
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);
    System.out.println(zdt);
这张照片

2017-11-17T10:49:39.772+01:00[Europe/Amsterdam]
我不需要重复@DarrenW已经说过的内容:当输入字符串以空格结尾且没有时间偏移时,格式模式字符串也应该以空格结尾且没有
Z
,因为
Z
与UTC的偏移相匹配(现在我还是重复了它)

Date
a
zoneDateTime
相反,它有一个时区(顾名思义),因此我认为这可能更适合您的要求

从历元获取毫秒数

这可能是猜测:您的呼叫
date.getTime()
给我的印象是,自1970年1月1日00:00:00 GMT(“纪元”)以来,您一直在追踪毫秒数。如果是,请:

    long millisSinceEpoch = zdt.toInstant().toEpochMilli();
结果是

1510912179772
使用字符串中的时区进行解析

更多的猜测,我不禁想,可能发生的是,您收到了一个日期-时间字符串,该字符串与格式模式字符串匹配,但其中的时区偏移量不正确,您将其剥离,在字符串的末尾留下了悬空空间。如果是这种情况,现代API在解析时只需忽略不正确的偏移量,就可以更轻松、更优雅地处理这种情况:

    String date = "2017-11-17 10:49:39.772 +0000";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS Z");
    ZoneId zid = ZoneId.of("Europe/Amsterdam");
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);
结果是2017-11-17T10:49:39.772+01:00[欧洲/阿姆斯特丹]
,与上面的第一个片段完全相同
LocalDateTime
是一个没有任何时区或偏移量信息的日期和时间,因此无法通过字符串的不正确偏移量。无论如何,
atZone()
仍然设置正确的时区


另一种方法是直接解析成一个
ZonedDateDate
,然后用ZoneSamelocal()调用它的
,以消除不需要的偏移量。

日期字符串的末尾有空格吗?只是想知道。当然,它仍然可以被解析。你的代码编译吗
date
声明为
String
String
没有
getTime
方法,但您的最后一行代码试图调用一个方法。您仍然使用
SimpleDateFormat
的具体原因是什么?我认为它已经过时很久了,从Q的数量来判断。