Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
始终从缺少字段的Java临时Accessor返回ZonedDateTime_Java_Datetime_Time - Fatal编程技术网

始终从缺少字段的Java临时Accessor返回ZonedDateTime

始终从缺少字段的Java临时Accessor返回ZonedDateTime,java,datetime,time,Java,Datetime,Time,我有一个类,它可以解析相当广泛的日期: // 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

我有一个类,它可以解析相当广泛的日期:

// 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

例如,假设给方法的字符串是5:45pm,它将成功解析;我希望ZoneDateTime反映今天下午5:45的当前时区。当然,一种更为先发制人的方式是,如果今天已经过了六点差一刻,那么第二天下午5点45分就开始反思,但我想先实施一下

其他可能的输入仅为一周中的某一天,例如星期一:这将返回为当前日期后的下一个星期一设置的ZoneDateTime,即本地时区的下午12点

仅输入日期4/2/2020将返回本地时区设置的ZonedDateTime,输入中的日期为2020年2月4日,时间设置为下午12点

我该怎么做呢?我目前有一些代码,它们只是由一个很长的ifs链组成:

但是,这只是修改当前日期时间组。我不知道如何实现像2和3这样的东西

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


谢谢大家

我认为您不能仅使用模式来实现这一点,但您可以创建DateTimeFormatterBuilder并调用其方法:


我怀疑您只能用一个模式来实现这一点,但您肯定可以使用新的DateTimeFormatterBuilder.appendPatternDATE\u TIME\u FORMAT\u模式;然后在同一个构建器上重复调用@VGR,这正是我所需要的,并且它成功地工作了。再次说明阅读Javadocs是很重要的。你介意把这个贴出来作为答案吗,这样我就可以把它标记为已解决,并给你一些信用?谢谢
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.
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);