gpt4 book ai didi

java - 始终从缺少字段的 Java TemporalAccessor 返回 ZonedDateTime

转载 作者:行者123 更新时间:2023-12-02 09:02:43 25 4
gpt4 key购买 nike

我有一个特定的类可以解析(相当)多种日期:

// imports omitted for brevity

public final class DateParser
{
private static final String DATE_TIME_FORMAT_PATTERN
= "[h][hh][[:][.]mm][[ ]a][ v][ ][[EEEE ][E ][d][dd][/][-][LLLL][L][/][-][uuuu]]";

private static final DateTimeFormatter formatter
= DateTimeFormatter.ofPattern(DATE_TIME_FORMAT_PATTERN).localizedBy(Locale.ENGLISH);

public static ZonedDateTime parseDateTimeString(final String dateTimeString)
{
TemporalAccessor parsedString = formatter.parse(dateTimeString);

ZonedDateTime returnable = ZonedDateTime.now();

// Return a ZonedDateTime with sane defaults if some fields are missing from parsedString
}
}

如果 parsedString 不是完整的 ZonedDateTime,我想返回一个具有合理默认值的 ZonedDateTime

  1. 例如,赋予该方法的字符串是“5:45pm”(成功解析);我希望 ZonedDateTime 反射(reflect)当前时区的今天下午 5:45。当然,如果今天已经过了六点一刻,那么更先发制人的方法是反射(reflect)第二天的下午 5:45,但我想首先实现这一点。

  2. 其他可能的输入只是星期几,例如“星期一”:这将返回设置为当前时间之后的下一个星期一的 ZonedDateTime当天中午 12 点,本地时间。

  3. 仅输入日期“4/2/2020” 将返回在本地时区设置的 ZonedDateTime,即输入中的日期 ( 2020年2月4日),时间定为中午12点。

我该如何去做呢?我目前有一些代码,仅由很长的 if 链组成:

if (parsedString.isSupported(ChronoField.YEAR))
{
returnable = returnable.withYear(parsedString.get(ChronoField.YEAR));
}
if (parsedString.isSupported(ChronoField.DAY_OF_MONTH))
{
returnable = returnable.withMonth(parsedString.get(ChronoField.MONTH_OF_YEAR));
}
if (parsedString.isSupported(ChronoField.DAY_OF_MONTH))
{
returnable = returnable.withDayOfMonth(parsedString.get(ChronoField.DAY_OF_MONTH));
}
// And so on.

但是,这仅修改当前日期时间组。我不知道如何实现(2)和(3)这样的事情。

此外,是否可以通过以某种方式迭代其字段来从 parsedString 构建 ZonedDateTime?或者还有其他方法来实现整个解析想法吗?

谢谢大家。

最佳答案

我认为您不能只使用模式来做到这一点,但您可以创建一个 DateTimeFormatterBuilder 并调用它的 parseDefaulting方法:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.appendPattern(DATE_TIME_FORMAT_PATTERN);

ZonedDateTime defaults = ZonedDateTime.now();

builder.parseDefaulting(ChronoField.YEAR,
defaults.getLong(ChronoField.YEAR));
builder.parseDefaulting(ChronoField.MONTH_OF_YEAR,
defaults.getLong(ChronoField.MONTH_OF_YEAR));
builder.parseDefaulting(ChronoField.DAY_OF_MONTH,
defaults.getLong(ChronoField.DAY_OF_MONTH));
// etc.

DateTimeFormatter formatter = builder.toFormatter();

ZonedDateTime returnable = ZonedDateTime.parse(dateTimeString, formatter);

关于java - 始终从缺少字段的 Java TemporalAccessor 返回 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60045914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com