将字符串解析为带 7 位小数的时间戳,日期时间格式

Parsing string to Timestamp with 7 decimals, datetime format

我正在尝试解析字符串并将其更改为时间戳。但是,我一直无法找到正确的日期时间格式。传递的时间字符串是这样的:

2020-07-23T02:46:04.0978382Z 我为 SimpleDateFormat 找到的格式与该字符串不完全匹配。我用过的最接近的,差了分秒,好像不太对。

我试过以下格式。 Format, 和 format6 解析它但时间戳完全关闭:

  def timestampTest() :Unit ={
    val timestampString = "2020-07-23T02:46:04.0978382Z" // from actual event
    val format = "yyyy-MM-dd'T'HH:mm:ss.SSS" // parses but makes it off by seconds, min, hour: 2020-07-23 03:02:22.382
    val format1= "yyyy-MM-dd'T'HH:mm:ss.SSSZ" // Cant parse
    val format2= "yyyy-MM-dd'T'HH:mm:ss.SSSX" // cant parse
    val format3= "yyyy-MM-dd'T'HH:mm:ss.SSSXX" // cant parse
    val format4 = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" // cant parse
    val format5 = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ" // cant parse
    val format6 = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"//  Time is off:  2020-07-23 03:02:22.382

    val dateFormat = new SimpleDateFormat(format)
    
    val x = new Timestamp(dateFormat.parse(timestampString).getTime)
 
    println(timestampString)
    println(x)
  }

是否有支持此类字符串的日期时间格式?或者看起来我收到的字符串是 adjusted/trimmed.

Is there a datetime format that supports such string?

是的,您可以明确地使用 ZonedDateTime or OffsetDateTime or Instant which parses the date-time string format of your question by default (i.e. without using any DateTimeFormatter.ofPattern

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.parse("2020-07-23T02:46:04.0978382Z");
        System.out.println(zdt);

        OffsetDateTime odt = OffsetDateTime.parse("2020-07-23T02:46:04.0978382Z");
        System.out.println(odt);

        Instant instant = Instant.parse("2020-07-23T02:46:04.0978382Z");
        System.out.println(instant);
    }
}

输出:

2020-07-23T02:46:04.097838200Z
2020-07-23T02:46:04.097838200Z
2020-07-23T02:46:04.097838200Z

我建议您从过时的 error-prone 遗留 date-time API 切换到 modern date-time API.

使用 SimpleDateFormat 出了什么问题?

SimpleDateFormat 不支持纳秒。它最多只支持毫秒,这就是输出中时间不对的原因。

我可以直接在JDBC中使用OffsetDateTime吗?

当然可以。查看 this page 了解更多信息。下面给出相同的屏幕截图(以防 link 将来损坏):

我可以从 OffsetDateTime 得到 Timestamp 吗?

是的,你可以(如下所示)但我不建议这样做,因为它继承了可怕的设计 java.util.Date。如前所述,您可以将 OffsetDateTime 直接与 JDBC 一起使用,并且您应该坚持使用现代的 date-time API.

import java.sql.Timestamp;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = OffsetDateTime.parse("2020-07-23T02:46:04.0978382Z");
        System.out.println(odt);

        Timestamp ts = Timestamp.valueOf(odt.atZoneSameInstant(ZoneOffset.UTC).toLocalDateTime());
        System.out.println(ts);
    }
}

输出:

2020-07-23T02:46:04.097838200Z
2020-07-23 02:46:04.0978382