如何获取OffsetDateTime-> LocalDateTime并将其另存为UTC?

即使经过大量搜索,我也没有找到适合我问题的合适答案。 它是Java API中的DateConvertUtil类。 这是一种重构/功能任务。

我有一个方法,该方法可解析给定的日期字符串,并在另一个方法的帮助下将其格式化并返回LocalDateTime(这种方法必须具有太多的依赖性)。

我想获取用户的时区,将(或可能不)转换为LocalDateTime,但不想每次都保存LocalDateTime,而是保存UTC。

我现在的问题是如何解决这个问题。 我似乎没有得到补偿。

解析器以前可以使用,但仅适用于LocaldateTime,格式化程序也可以使用。

到目前为止,我有

    public static LocalDateTime parseIso8601(String date) {
        if (date == null || date.isEmpty() || date.trim().equalsIgnoreCase("") || date.length() < 10) throw new
                IllegalArgumentException("Date cannot by empty or smaller than 10 characters for parsing! Minimum date " +
                "is yyyy-MM-dd");


        LocalDateTime localDateTime;
        OffsetDateTime offsetDateTime = OffsetDateTime.now();
        offsetDateTime.toInstant().atZone(ZoneOffset.UTC);

        localDateTime = offsetDateTime.toLocalDateTime();

        return localDateTime.parse(date,buildIso8601Formatter());

所以我已经阅读了有关ZonedDateTime和Timestamps的内容,但是也许我只是想不通。

感谢您的帮助。

yuanyuanlizhu 回答:如何获取OffsetDateTime-> LocalDateTime并将其另存为UTC?

不是很清楚。您可能正在追求类似以下的内容:

    ZoneId userTimeZone = ZoneId.systemDefault();

    String date = "2019-12-25";

    LocalDateTime localDateTime = LocalDate.parse(date).atStartOfDay();
    System.out.println("localDateTime: " + localDateTime);

    OffsetDateTime utcDateTime = localDateTime.atZone(userTimeZone)
            .toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC);
    System.out.println("utcDateTime: " + utcDateTime);

当我在时区(欧洲/哥本哈根)中运行此代码段时,输出为:

localDateTime: 2019-12-25T00:00
utcDateTime: 2019-12-24T23:00Z

您说:

我想获取用户的时区,...

执行此操作的方法不同。在独立应用程序中,您可以像上面的代码中那样尝试ZonedId.systemDefault()。它为您提供了JVM的默认时区,该默认时区可能与用户期望的一致或不一致。而且可以随时从您程序的另一部分或在同一JVM中运行的另一个程序更改此设置,因此非常脆弱。在用户位于不同时区ZoneId.systemDefault()的服务器上根本无法工作。您需要从某些客户端/浏览器传递时区。有很多方法,您可以在设置中搜索实现方法。

...但是不想每次都保存LocalDateTime,而要保存UTC。

那很好,建议使用UTC。同样,执行此操作的方法取决于您的设置。如果保存到SQL数据库,则可以保存OffsetDateTimeInstant(前提是您使用的是JDBC 4.2兼容驱动程序,很有可能),因此上述代码就足够了。如果需要将日期和时间存储为字符串,请使用Instant.toString()来生成ISO 8601格式的字符串。我建议您不要在UTC中为日期和时间使用LocalDateTime,因为它本身并不“知道”它在UTC中,这会使出错的风险太大。其他示例:

    Instant utcInstant = localDateTime.atZone(userTimeZone).toInstant();
    System.out.println("utcInstant: " + utcInstant);

    String utcDateTimeString = utcDateTime.toString();
    System.out.println("utcDateTimeString: " + utcDateTimeString);
utcInstant: 2019-12-24T23:00:00Z
utcDateTimeString: 2019-12-24T23:00Z

utcInstant的名称实际上是多余的或无意义的,因为一方面Instant与时区无关,另一方面,它始终以UTC打印。抱歉,我想不出更好的名字。如果可以的话,Anuway可以很好地存储。

本文链接:https://www.f2er.com/2792570.html

大家都在问