微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

日期和时间在特定索引处显示解析错误

如何解决日期和时间在特定索引处显示解析错误

我从 JSON API URL 获取日期和时间,格式是这样的

    '2021-03-05 09:18:07' which is in String form.

但是当我想以毫秒为单位进行转换时,它给了我一个索引 10 的错误。我不知道为什么会出现这个问题,我检查了其他 Stackoverflow 答案但没有成功

  DateTimeFormatter formatter ;
                                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                                    formatter = DateTimeFormatter.ofPattern(
                                            "yyyy-MM-dd'T'HH:mm:ss",Locale.ROOT);
                                    String dates = object.getString("created_at");
                                   long  timeInMilliseconds = OffsetDateTime.parse(dates,formatter)
                                            .toInstant()
                                            .toEpochMilli();
                                    System.out.println("Date in milli :: USING ThreeTenABP >>> " + 
                                   timeInMilliseconds);

                                }
                                String text = TimeAgo.using(timeInMilliseconds);
                                FeedModel.setDateSnap(text);

这里是错误

     java.time.format.DateTimeParseException: Text '2021-03-05 09:18:07' Could not be parsed: Unable 
     to obtain OffsetDateTime from TemporalAccessor: {},ISO resolved to 2021-03-05T09:18:07 of type 
     java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
    at java.time.OffsetDateTime.parse(OffsetDateTime.java:396)
    at com.example.wasigram.MainActivity$1.onResponse(MainActivity.java:91)
    at com.androidnetworking.common.ANRequest.deliverSuccessResponse(ANRequest.java:729)
    at com.androidnetworking.common.ANRequest.access$6500(ANRequest.java:80)
    at com.androidnetworking.common.ANRequest$6.run(ANRequest.java:709)
    at android.os.Handler.handleCallback(Handler.java:888)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:213)
    at android.app.ActivityThread.main(ActivityThread.java:8178)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
 Caused by: java.time.DateTimeException: Unable to obtain OffsetDateTime from TemporalAccessor: {},ISO resolved to 2021-03-05T09:18:07 of type java.time.format.Parsed
    

解决方法

使用 Java SE 8 API

您可以使用 DateTimeFormatter#withZone 获取具有指定区域的格式化程序。

此外,请使用正确的格式 yyyy-MM-dd HH:mm:ss,其中没有您错误地放入模式中的 'T'。事实上,我更喜欢使用 u 而不是 y,如 this answer 中所述。

演示:

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 strDateTime = "2021-03-05 09:18:07";
        
        DateTimeFormatter formatter = DateTimeFormatter
                                        .ofPattern("uuuu-MM-dd HH:mm:ss",Locale.ENGLISH)
                                        .withZone(ZoneOffset.UTC);
        
        long millis = OffsetDateTime
                        .parse(strDateTime,formatter)
                        .toInstant()
                        .toEpochMilli();
        
        System.out.println(millis);
    }
}

输出:

1614935887000

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

使用 ThreeTen-Backport API

import java.util.Locale;

import org.threeten.bp.LocalDateTime;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2021-03-05 09:18:07";
        
        DateTimeFormatter formatter = DateTimeFormatter
                                        .ofPattern("uuuu-MM-dd HH:mm:ss",Locale.ENGLISH);
        
        long millis = LocalDateTime
                        .parse(strDateTime,formatter)
                        .toInstant(ZoneOffset.UTC)
                        .toEpochMilli();
        
        System.out.println(millis);
    }
}

输出:

1614935887000
,

你有两个问题:

  1. 您的格式模式字符串与您的 JSON 字符串不完全匹配。
  2. 您不能天真地将不包含 UTC 偏移量的搅拌解析为 OffsetDateTime

格式模式字符串

字符串 2021-03-05 09:18:07 中的索引 10 是月份中某一天之后的空格所在的位置。因此,让我们看看您的格式模式,看看在一个月的某一天之后会发生什么。您的格式模式字符串是 yyyy-MM-dd'T'HH:mm:ss,月份的第几天之后是 'T',这意味着文字 T,即 T 不是模式字母。您的例外是因为 T 和空格不相等。

解析问题的提示:当您看不到解析中的问题时,请先尝试格式化。

    String dates = "2021-03-05 09:18:07";
    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss",Locale.ROOT);
    
    OffsetDateTime expectedResult
            = OffsetDateTime.of(2021,3,5,9,18,7,ZoneOffset.ofHours(1));
    
    System.out.println("Parsing:   " + dates);
    System.out.println("Formatted: " + expectedResult.format(formatter));

输出为:

Parsing:   2021-03-05 09:18:07
Formatted: 2021-03-05T09:18:07

我希望现在更容易看出字符串中的空格与格式化程序期望的字符串中的 T 之间的区别。

您可能已经找到了解决方案:在格式模式字符串中放置一个空格而不是 'T'(如果您愿意,可以将空格放在单引号中,但这不是必需的)。

解析为 OffsetDateTime

此修复仍然失败:

    // Put a space in the format pattern string
    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss",Locale.ROOT);
    
    OffsetDateTime odt = OffsetDateTime.parse(dates,formatter);

线程“main”中的异常java.time.format.DateTimeParseException: 无法解析文本“2021-03-05 09:18:07”:无法获取 来自 TemporalAccessor 的 OffsetDateTime:{},ISO 解析为 2021-03-05T09:18:07 类型 java.time.format.Parsed

有趣的是,这也是您问题中堆栈跟踪中的异常。

OffsetDateTime 必须包含与 UTC 的偏移量,而 Java 无法从中获取它。您知道您从中获取字符串的 API 假定哪个时区吗?如果是这样,请使用它。我的建议是:

    ZoneId zoneAssumedByApi = ZoneId.of("Antarctica/Troll");
    long  timeInMilliseconds = LocalDateTime.parse(dates,formatter)
            .atZone(zoneAssumedByApi)
            .toInstant()
            .toEpochMilli();
    System.out.println("Date in milli :: USING ThreeTenABP >>> "
            + timeInMilliseconds);

以毫为单位的日期 :: 使用 ThreeTenABP >>> 1614935887000

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。