首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >总是从缺少字段的Java ZonedDateTime返回ZonedDateTime

总是从缺少字段的Java ZonedDateTime返回ZonedDateTime
EN

Stack Overflow用户
提问于 2020-02-03 19:28:37
回答 1查看 77关注 0票数 0

我有一门课可以分析(相当多的)各种各样的日期:

代码语言:javascript
复制
// 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
    }
}

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

  1. 例如,假设给该方法的字符串是"5:45pm" (它将成功地解析);我希望ZonedDateTime在当前时区今天下午5:45进行反映。当然,一个更先发制人的方法是在第二天下午5:45,如果今天已经过了25点半的话,但是我想先把它付诸实施。
  2. 其他可能的输入仅仅是一周中的一天,例如,"Monday":这将返回在当前一天之后的下一个星期一在当地时区下午12点设置的ZonedDateTime
  3. 只要输入一个日期"4/2/2020",就会返回一个在本地时区设置的ZonedDateTime,即输入中的日期(2020年2月4日),时间设置为下午12时。

我该怎么做呢?我现在有一些代码,它只是由一个非常长的if链组成:

代码语言:javascript
复制
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)这样的东西。

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

谢谢各位。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-04 01:41:04

我认为您不能只用一个模式来完成这个任务,但是您可以创建一个DateTimeFormatterBuilder并调用它的parseDefaulting方法:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60045914

复制
相关文章

相似问题

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