在Java 8中使用replaceAll函数作为日期和时间戳

问题描述 投票:-1回答:2

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

输入:

  • string date =“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
2个回答
0
投票

执行回答:不,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点到03点,因此还有HH(一天中的小时)到hh(在AM或PM内的小时)。如果这些变化不正确,那就改成你想要的变化吧。

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

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

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


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将不会投诉,结果将是不正确的字符串。

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

© www.soinside.com 2019 - 2024. All rights reserved.