首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTime("2019-08-07T19:20-5:00")转换为具有偏移值的本地日期时间

DateTime("2019-08-07T19:20-5:00")转换为具有偏移值的本地日期时间
EN

Stack Overflow用户
提问于 2022-07-04 07:10:28
回答 2查看 116关注 0票数 3

我从源系统获得以下字符串格式的日期时间内容和偏移时间值。

代码语言:javascript
复制
2019-08-07T19:20-5:00

使用偏移值将其转换为日期时间的位置。我试了下,但没有得到预期的结果。

代码语言:javascript
复制
OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-08-07T19:20-5:00"); 
System.out.println(sourceDateTime.getOffset());

输出

代码语言:javascript
复制
Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-08-07T19:20-5:00' could not be parsed at index 16
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
    at java.base/java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
    at java.base/java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
    at com.example.demo.Testfile.main(Testfile.java:19)

有什么简单的方法可以达到预期的输出吗?

注意:我使用的是Java 8

EN

回答 2

Stack Overflow用户

发布于 2022-07-04 07:37:19

如果没有ISO String…,则不能使用ISO格式化程序。问题似乎是您得到的偏移量的格式,它是+H:mm,而不是在ISO标准中使用的格式,即+HH:mm。一句话:它不考虑个位数的小时数.

您必须针对这种情况构建一个特定的DateTimeFormatter

不幸的是,Java 8不支持使用偏移量小时数的单数表示的模式,但是如果您可以使用Java 9或更高版本,则可以定义考虑以+H:mm格式的区域偏移的DateTimeFormatter

Java 9+

代码语言:javascript
复制
public static void main(String[] args) {
    DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                    .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                                    .appendOffset("+H:mm", "UTC")
                                    .toFormatter(Locale.ENGLISH);
    OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-08-07T19:20-5:00", dtf);
    System.out.println(sourceDateTime.getOffset());
}

这将对LocalDateTime使用ISO格式化程序,并附加用于解析偏移量的特定模式。

诚然,我不确定"UTC"是否是一个好的(硬编码的)选择,作为默认偏移量,以防String不包含任何偏移量。

此代码的输出:

代码语言:javascript
复制
-05:00

Java 8-> String操作

代码语言:javascript
复制
public static void main(String[] args) {
    // provide some variants of input
    List<String> variants = List.of(
            "2019-08-07T19:20-5:00", "2019-08-07T19:20+5:00",
            "2019-08-07T19:20-05:00", "2019-08-07T19:20+05:00"
    );
    
    // handle offset extraction via String manipulation for each variant
    variants.forEach(variant -> {
        String parseable = variant;
        /*
         * This assumes an offset always has a sign and 
         * a colon that separates hours and minutes.
         *
         * Get all their indexes in order to find the offset
         */
        int lastIndexOfColon = variant.lastIndexOf(':');
        int lastIndexOfMinus = variant.lastIndexOf('-');
        int lastIndexOfPlus = variant.lastIndexOf('+');
        
        /*
         * Decide which sign actually leads the offset
         * (it's either a plus or the very last minus).
         * In either case insert a leading zero if the amount of digits/chars
         * between '-'/'+' and ':' is 1, otherwise don't do anything…
         */
        if (lastIndexOfMinus > lastIndexOfPlus && lastIndexOfMinus + 2 == lastIndexOfColon) {
            parseable = variant.substring(0, lastIndexOfMinus + 1) 
                        + '0' 
                        + variant.substring(lastIndexOfMinus + 1);
        } else if (lastIndexOfPlus + 2 == lastIndexOfColon) {
            parseable = variant.substring(0, lastIndexOfPlus + 1)
                        + '0'
                        + variant.substring(lastIndexOfPlus + 1);   
        }
        // then parse the manipulated String
        OffsetDateTime odt = OffsetDateTime.parse(parseable);
        // get the offset
        ZoneOffset zoneOffset = odt.getOffset();
        // and print some result
        String msg = String.format("%s has an offset of %s", variant, zoneOffset);
        System.out.println(msg);
    });
}

此示例的输出为

代码语言:javascript
复制
2019-08-07T19:20-5:00 has an offset of -05:00
2019-08-07T19:20+5:00 has an offset of +05:00
2019-08-07T19:20-05:00 has an offset of -05:00
2019-08-07T19:20+05:00 has an offset of +05:00

另一种方法可以是将偏移部分从日期和时间中分离出来,并使用解析后的值左、右到最后一个冒号创建一个ZoneOffset.of(int, int)。解析日期-时间部分并随后应用偏移量也可能导致所需的结果。

票数 9
EN

Stack Overflow用户

发布于 2022-07-04 07:18:44

这是正确的代码

代码语言:javascript
复制
OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-08-07T19:20-05:00");
System.out.println(sourceDateTime.getOffset());
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72852932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档