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

德鲁斯

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

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

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

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

该解析器之前曾在工作,但仅对于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的信息,但也许我只是想不通。

感谢您的帮助。

Ole VV:

不太清楚。您可能正在追求以下类似的东西:

    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数据库中,则可以保存一个OffsetDateTime或一个Instant(前提是您使用的是JDBC 4.2兼容驱动程序,这很有可能),因此上述代码就足够了。如果需要将日期和时间存储为字符串,请使用Instant.toString()ISO 8601格式生成字符串。我建议LocalDateTime您不要在UTC 中使用日期和时间,因为它不会“知道”它在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可以很好地存储。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何从TradingView图表中获取数据并将其另存为CSV文件?

Django的。如何获取会话并将其另存为外键。

如何从Pygame中的用户获取输入并将其另存为变量?

如何将其转换为数据框并将其另存为 csv?

获取日期并将其另存为文件名python

如何对熊猫列进行数学运算并将其另存为新数据框

如何在Linux中提取行并将其另存为文本文件

如何使用Excel VBA打开.csv并将其另存为.xlsx

如何从图像中删除轮廓最大的对象并将其另存为单独的图像?

如何使用OpenOffice打开Excel文件并将其另存为CSV

如何在Java中绘制图形并将其另存为图像

MATLAB-如何从.fig文件中裁剪图像的某些部分并将其另存为.mat?

如何在 HIVE 中创建 DDL 并将其另存为目录中的文件

如何将我的输出转换为 .JSON 并将其另存为 .json 文件

如何以编程方式保存来自visdiff的MATLAB比较结果并将其重新加载到GUI或另存为HTML?

如何更改图像中每个像素的最后一位并将其另存为新图像?

如何为jpg添加透明填充并将其另存为具有透明度的png?

如何跳过行,直到在txt文件中找到“关键字”并将其余内容另存为csv?蟒蛇

如何使用反射从已编译的程序集中随机生成短语/问题/值并将其另存为数据集?

如何从Visual Studio中读取arduino串行监视器数据并将其另存为数组

如何获取文件并另存为域名?

如何隐藏用户密码输入并将其另存为输出以替换另一个文件中的默认密码

如何在大量gz /常规文件中查找包含某些字符串的日志并将其另存为一个/多个txt文件?

在PHP上获取500 Internal Server Error并将画布另存为图像

如何在画布上绘制多个图像并将画布另存为png图像

如何转置一组列并将输出另存为CSV

如何使用tcl / tk浏览目录并将路径另存为文件中的变量

python如何读取tsv文件,将其清理并另存为新文件?

如何从php中的变量中删除逗号,以便将其另存为浮点值?