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