2

为了使用junit进行比较,我必须转换日期。我从数据库中得到一个日期,即“ 06/25/2021 10:26:33.0 ”,我必须将其转换为“ 2021-06-25T10:26:33.000-04:00 ”,然后才能在断言中使用它。

我试图不在 java 中使用 SimpleDate,而是使用内置的 java.time。但是,我认为我并没有真正理解其中的所有内容。这是我一直在玩的代码片段。我已经尝试了很多事情,当解析发生时我总是得到一个错误。

 public String test() throws ParseException {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
    LocalDateTime ldt = LocalDateTime.parse("06/25/2021 10:26:33.0", dtf);
    //After the above line I have a date like: 2021-06-25T10:26:33.0
    ZoneId zone = ZoneId.of("UTC-04:00");
    ZonedDateTime zdt = ldt.atZone(zone);
    Instant instant = zdt.toInstant();
    return instant.toString();
}

在我看来,我认为我必须首先将日期转换为“可接受”格式,因为我觉得这种字符串格式 - “yyyy-MM-dd HH:mm:ss.S”不是 java.time可以处理。它给了我一个错误,例如“无法在索引 19 处解析文本”,然后可能在第二遍中将其转换为“2021-06-25T10:26:33.000-04:00”。

我已经在 SO 上查阅了几篇关于此的文章,但无法找到有助于转换自定义格式的内容。我知道“解析”和“格式”是必须在此处使用的 2 个 API 方法,但不知道如何去做。有人可以将我推向正确的方向吗?

4

2 回答 2

3

你可以使用LocalDateTime#atOffset来满足这个要求。

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String input = "06/25/2021 10:26:33.0";
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("M/d/u H:m:s.S", Locale.ENGLISH);
        LocalDateTime ldt = LocalDateTime.parse(input, dtfInput);
        OffsetDateTime odt = ldt.atOffset(ZoneOffset.of("-04:00"));
        System.out.println(odt);

        // Formatted output
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
        String formatted = dtfOutput.format(odt);
        System.out.println(formatted);
    }
}

输出:

2021-06-25T10:26:33-04:00
2021-06-25T10:26:33.000-04:00

ONLINE DEMO

笔记:

  1. 如果秒的小数部分在输入中可以是零到九位,请使用模式,M/d/u H:m:s[.[SSSSSSSSS][SSSSSSSS][SSSSSSS][SSSSSS][SSSSS][SSSS][SSS][SS][S]]其中可选模式已使用方括号指定。
  2. OffsetDateTime#toString如果它们为零,则省略第二部分和小数部分。使用 aDateTimeFormatter在格式化字符串中获取它们。

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-08-24T16:59:22.717 回答
1

将其转换为此“2021-06-25T10:26:33.000-04:00”。

我认为您需要一个自定义格式化程序。也许如下:

    public String test() {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/uuuu HH:mm:ss.S");
        LocalDateTime ldt = LocalDateTime.parse("06/25/2021 10:26:33.0", dtf);
        ZoneOffset zoff = ZoneOffset.ofHours(-4);
        OffsetDateTime ldt2 = ldt.atOffset(zoff);
        DateTimeFormatter tsf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
        return tsf.format(ldt2);
    }

于 2021-08-24T17:19:08.867 回答