1

如何将作为字符串 2018-08-10T18:25:00.000+0000 传递的日期时间转换为 Instant?我尝试了以下方法,但没有成功。

 public static Instant toInstant(final String timeStr) {
    if (StringUtils.isBlank(timeStr)) {
        throw new IllegalArgumentException("Invalid date time value passed [" + timeStr + "]");
    }

    try {
        return LocalDate.parse(timeStr).atStartOfDay().toInstant(ZoneOffset.UTC);
    } catch (Exception e) {
        try {
            return LocalDateTime.parse(timeStr).toInstant(ZoneOffset.UTC);
        } catch (Exception e1) {
            try {
                return ZonedDateTime.parse(timeStr).toInstant();
            } catch (Exception e2) {
                try {
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                    return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
                } catch (Exception e3) {
                    try {
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
                        return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
                    } catch (Exception e4) {
                        try {
                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
                            return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
                        } catch (Exception e5) {
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
                            return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
                        } finally {
                            throw new IllegalArgumentException("Incorrect date time value passed [" + timeStr + "]");
                        }
                    }
                }
            }
        }
    }
}
4

3 回答 3

1

您可以OffsetDateTime使用DateTimeFormatter. 像这样的东西,

public static Instant toInstant(final String timeStr) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    OffsetDateTime dateTime = OffsetDateTime.parse(timeStr, formatter);
    return dateTime.toInstant();
}
于 2021-10-11T19:50:59.327 回答
1

您的字符串2018-08-10T18:25:00.000+0000具有+0000小时的时区偏移量,因此,您应该将OffsetDateTime其解析为可以转换为Instant.

演示:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSZ", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("2018-08-10T18:25:00.000+0000", dtf);
        Instant instant = odt.toInstant();
        System.out.println(instant);
    }
}

输出:

2018-08-10T18:25:00Z

ONLINE DEMO

上述DateTimeFormatter解决方案中使用的方法仅适用于模式中指定的固定位数,例如分秒内仅 3 位数。DateTimeFormatter可以使用DateTimeFormatterBuilder以下演示中所示构建更好的:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                                .appendPattern("Z")
                                .toFormatter(Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("2018-08-10T18:25:00.000+0000", dtf);
        Instant instant = odt.toInstant();
        System.out.println(instant);
    }
}

输出:

2018-08-10T18:25:00Z

ONLINE DEMO

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


* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供java.time.

于 2021-10-11T21:57:52.117 回答
0

你的麻烦就在这里:

        } finally {
            throw new IllegalArgumentException("Incorrect date time value passed [" + timeStr + "]");
        }

您的解析在这些行中是成功的(但可能会给出不正确的结果):

            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
            return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);

成功解析字符串后,在您的finally块中抛出异常。所以调用者没有收到结果,而是得到一个异常,并且必须认为解析或转换失败。

结果不正确?您的解析LocalDateTime会丢弃字符串中的 UTC 偏移量,+0000. 接下来,您转换为Instant假定 UTC,在这种情况下恰好与字符串一致。如果字符串中的偏移量不是+0000(例如,+0100),您将得到一个不正确的Instant.

其他答案显示了将字符串转换为Instant.

于 2021-10-12T06:49:31.157 回答