【问题标题】:Parsing string to Timestamp with 7 decimals, datetime format将字符串解析为带 7 位小数的时间戳,日期时间格式
【发布时间】:2020-07-30 19:53:20
【问题描述】:

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

2020-07-23T02:46:04.0978382Z 我为 SimpleDateFormat 找到的格式与此字符串不完全匹配。我用过的最接近的一个,分分钟和秒,这似乎不对。

我尝试了以下格式。格式化,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)
  }

是否有支持此类字符串的日期时间格式?还是看起来我收到的字符串会被调整/修剪。

【问题讨论】:

    标签: java scala datetime simpledateformat


    【解决方案1】:

    有支持这种字符串的日期时间格式吗?

    是的,您可以使用 ZonedDateTimeOffsetDateTimeInstant 默认解析问题的日期时间字符串格式(即不明确使用任何 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
    

    我建议您从过时且容易出错的旧日期时间 API 切换到 modern date-time API

    使用SimpleDateFormat 出了什么问题?

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

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

    是的,当然。查看this page 了解更多信息。下面给出相同的屏幕截图(以防将来链接断开):

    我可以从OffsetDateTime 得到Timestamp 吗?

    是的,你可以(如下所示),但我不建议这样做,因为它继承了设计糟糕的java.util.Date。如前所述,您可以直接将OffsetDateTime 与 JDBC 一起使用,并且您应该坚持使用现代日期时间 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2021-02-08
      • 1970-01-01
      相关资源
      最近更新 更多