解析ISO 8601格式的String时出现SimpleDateFormat问题

时间:2017-05-16 13:34:26

标签: java date iso8601

欣赏有很多相似的帖子,但我无法找到特定的帖子来帮助。

我试图将此字符串转换为Java中的日期

  

2017-05-16 06:24:36-0700

但每次使用此代码都失败

Date Login = new SimpleDateFormat("dd/MM/yy HH:mm:ss").parse("2017-05-16 06:24:36-0700");

现在我假设它由于最后的时区信息 - 我无法弄清楚如何设置格式。我试过这个但没有运气

SimpleDateFormat("dd/MM/yy HH:mm:ssZ")

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

传递给 function UploadFile(file) { // following line is not necessary: prevents running on SitePoint servers if (location.host.indexOf("sitepointstatic") >= 0) return var xhr = new XMLHttpRequest(); if (xhr.upload && file.type == "image/jpeg" && file.size <= $id("MAX_FILE_SIZE").value) { // create progress bar var o = $id("progress"); var progress = o.appendChild(document.createElement("p")); progress.appendChild(document.createTextNode("upload " + file.name)); // progress bar xhr.upload.addEventListener("progress", function(e) { var pc = parseInt(100 - (e.loaded / e.total * 100)); progress.style.backgroundPosition = pc + "% 0"; }, false); // file received/failed xhr.onreadystatechange = function(e) { if (xhr.readyState == 4) { progress.className = (xhr.status == 200 ? "success" : "failure"); } }; // start upload xhr.open("POST", $id("upload").action, true); xhr.setRequestHeader("X_FILENAME", file.name); xhr.send(file);//This is line 116 } } 的日期格式为SimpleDateFormat,而您尝试解析的日期格式为"dd/MM/yy"。试试这个:

"yyyy-MM-dd"

作为旁注,根据您使用的Java版本,我建议使用新的java.time软件包(JDK 1.8+)或该软件包的back port(JDK 1.6+)而不是过时的(没有双关语)Date login = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ").parse("2017-05-16 06:24:36-0700"); 和/或Date类。

Calendar

答案 1 :(得分:3)

我已经完全赞同Bryan’s answer因为它包含并推荐了java.time解决方案。不过,我需要补充一些想法。

您的代码reviloSlater会丢弃时区信息(更准确地说,区域偏移信息),我不确定从一开始就敢做到这一点。对于java.time类,包含它是更自然的,当我们确定不需要它时,很容易丢弃。

使用offset进行解析:

    OffsetDateTime loginOdt = OffsetDateTime.parse("2017-05-16 06:24:36-0700",
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssZ"));

删除时区偏移信息

    LocalDateTime loginLdt = loginOdt.toLocalDateTime();

LocalDateTime是没有任何时区或偏移信息的日期和时间。在这种情况下,我们当然得到

2017-05-16T06:24:36

Bryan的java.time代码也使用字符串中的时区偏移信息。编辑:在Bryan编辑之后,代码现在可以工作并给我们:

2017-05-16T13:24:36Z

这是相同的时间点(Instant.toString()以UTC格式打印时间)。另一种方法是,在我们可以做之前使用OffsetDateTime

    Instant login = loginOdt.toInstant();

java.time充满了可能性。