提问者:小点点

Java和LocalDateTime. parse麻烦


很抱歉这个问题是基本的,并且无法展示我尝试过的东西。但是到目前为止,我很难理解Javas DateTimeFor物质和LocalDateTime。

代码不起作用,但显然在我不知道的一些更改之前一直在工作(我刚刚把这段代码扔在我的腿上):

public getDateForIception() {
    String tid = driver.findElement(By.cssSelector("div.hendelse-tid.hb-tekst--ingenBryting"))
        .getText().replaceAll("(?<=[A-Za-z]{3})[.a-z]{1,2}", "");
    if(tid.split("\\.")[0].length() == 1) {
        tid = "0" + tid;
    }

    return DatoUtils.parseDatoLocalDateTime(tid,  "dd. MMM yyyy HH:mm");
}

不完全确定替换字符等的意义,但在这种情况下,if()没有执行,“tid”变量没有改变。只是将其保留在此处以供可能的参考。

public static LocalDateTime parseDatoLocalDateTime(String datoString, String pattern) {
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern(pattern)
        .toFormatter(Locale.forLanguageTag("no"));
    return LocalDateTime.parse(datoString, formatter);
}

我怀疑从页面读取的格式发生了一些变化,因此解析失败。但错误消息对我来说意义不大:

java.time.format.DateTimeParseException: Text '15. jun 2022 19:51' could not be parsed at index 4

想法或解决方案受到高度赞赏。


共1个答案

匿名用户

在格式化程序生成器中,挪威语由此行设置

.toFormatter(Locale.forLanguageTag("no"));

您可以使用语言标签en将语言环境设置为英语,或者您应该提供挪威的月份名称(末尾有一个点,用于缩短变体),例如jan.feb.mar.apr.mai(点不是必需的,因为它是完整的月份名称)等。

编辑:经过额外的研究,我发现你可以解析挪威月份,而不需要在末尾加上一个点。要做到这一点,你需要使用一个月的独立格式(LLL而不是MMM)。

因此,您的代码将如下所示

public getDateForIception() {
    String tid = driver.findElement(By.cssSelector("div.hendelse-tid.hb-tekst--ingenBryting"))
        .getText().replaceAll("(?<=[A-Za-z]{3})[.a-z]{1,2}", "");
    if(tid.split("\\.")[0].length() == 1) {
        tid = "0" + tid;
    }

    return DatoUtils.parseDatoLocalDateTime(tid,  "dd. LLL yyyy HH:mm");
}

public static LocalDateTime parseDatoLocalDateTime(String datoString, String pattern) {
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern(pattern)
        .toFormatter(Locale.forLanguageTag("no"));
    return LocalDateTime.parse(datoString, formatter);
}