【问题标题】:Using replaceAll function in Java 8 for date and timestamp在 Java 8 中使用 replaceAll 函数获取日期和时间戳
【发布时间】:2018-08-09 03:15:29
【问题描述】:

我想在最后将日期和时间戳的两个不同输入设置为 UTC 日期。我不确定使用replaceAll 函数是否有效。

输入:

  • 字符串日期=“06/04/2019”,格式为“MM/dd/yyyy”
  • string timestamp = "15/03/2018 15:46:59.000386 PM -05:00" 其格式 是“dd/MM/yyyy hh:mm:ss.SSSSSS a XXX”

输出: “06/04/2019 15:46:59.000386 PM -05:00”然后将其转换为 UTC...

【问题讨论】:

标签: java date java-8 timestamp utc


【解决方案1】:

为了补充上面的另一个答案,您也可以先解析LocalDate,然后将其与OffsetTime 连接以创建OffsetDateTime

OffsetDateTime timestampOnDate = LocalDate
    // parse date (dd/MM/uuuu)
    .parse(dateString, dateFormatter)
    // join with time and offset (ignores 15/03/2018) 
    .atTime(OffsetTime.parse(timestampString, timestampFormatter));

OffsetTime.parse 将创建一个具有时间和偏移量部分的对象(忽略您不想要的日期,在本例中为“15/03/2018”),并将其与 LocalDate 连接会产生想要OffsetDateTime

但不确定哪个代码更好。我猜两者是等价的。


replaceAll 可能有效,但前提是 dateString 是有效日期 - 解析时会检查该日期。如果日期字符串包含无效的日期,例如 35/99/0000,或其他格式的有效日期,甚至是一些无意义的文本,replaceAll 不会抱怨,结果将是一个不正确的字符串。

但是将这些无效值解析为日期会引发异常,因此最好将数据作为它们真正代表的类型来处理。

【讨论】:

  • 优雅! java.time 充满了可能性。我想我仍然想将时间戳解析为OffsetDateTime,而不是从一开始就丢弃信息。但是您可以使用它的toOffsetTime 方法并按照您的代码进行操作。这样可能会感觉更自然?
  • 是的,你的反馈我都玩过,效果很好!最后,我从第三方获得的时间戳输入,他们对其进行了修改,以便我可以收到一个正常的时间戳,如 MM/dd/yyyy .....谢谢大家!
【解决方案2】:

执行回答:String.replaceAll 无法将您的日期时间或日期转换为 UTC。

Java(尤其是 Java 8 及更高版本)对解析、处理、转换和格式化日期和时间有很好的支持。例如:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    DateTimeFormatter timestampFormatter = DateTimeFormatter
            .ofPattern("dd/MM/yyyy hh:mm:ss.SSSSSS a XXX", Locale.ENGLISH);

    String dateString = "06/04/2019";
    String timestampString = "15/03/2018 03:46:59.000386 PM -05:00";
    OffsetDateTime timestampOnDate = OffsetDateTime
            .parse(timestampString, timestampFormatter)
            .with(LocalDate.parse(dateString, dateFormatter));
    System.out.println("Output:        " + timestampOnDate.format(timestampFormatter));
    System.out.println("Output in UTC: "
            + timestampOnDate.withOffsetSameInstant(ZoneOffset.UTC)
                    .format(timestampFormatter));

打印出来:

Output:        06/04/2019 03:46:59.000386 PM -05:00
Output in UTC: 06/04/2019 08:46:59.000386 PM Z

您的字符串和格式不太合理,所以我稍微更改了它们:MM/dddd/MM,下午 15 点到下午 3 点,因此还有 HH(一天中的一个小时)到 @987654327 @(上午或下午的小时)。如果这些更改不正确,请改用您想要的。

编辑:当然,如果你坚持,你可以这样做

    timestampString = timestampString.replaceFirst("^\\d{2}/\\d{2}/\\d{4}", dateString);

——获取06/04/2019 03:46:59.000386 PM -05:00,然后像以前一样解析。我认为这段代码的可读性较差,而且它也不会首先验证时间戳字符串中的日期。我建议使用日期时间类来操作您的日期和时间戳,就像我在代码示例中所做的那样。

【讨论】:

  • 完全同意您的回答,也同意亨利。你是专业人士!!!非常感谢您如此透彻地解释它,我将从这里开始。
  • 是的,我在里面打错了 dd,对此感到抱歉
猜你喜欢
  • 2012-04-15
  • 2017-12-01
  • 1970-01-01
  • 2019-07-04
  • 2013-11-03
  • 2021-09-26
  • 2012-08-05
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多