当前位置: 首页 > 知识库问答 >
问题:

DateTimeFormatter:根据另一个字段的值包括可选字段

亢奇
2023-03-14

我想格式化一个<code>java.time。LocalTime,但格式可以根据其值而变化:

  • 如果一天中的小时数为12或0,请使用格式HH:mm
  • 否则,请使用格式HH:mm:ss

我当然可以这样做:

if (t.getHour() == 12 || t.getHour() == 0) {
    // use "HH:mm" formatter
} else {
    // use "HH:mm:ss" formatter
}

但为此,我需要创建两个不同的格式化程序。

我只想使用一个可以多次重用的格式化程序:

DateTimeFormatter fmt = // create this "conditional" formatter
fmt.format(LocalTime.of(14, 0))); // 14:00:00
fmt.format(LocalTime.of(12, 0))); // 12:00

我正在尝试使用DateTimeFormatterBuilder来做到这一点:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
    .appendPattern("HH:mm")
    // how to append seconds (and the ":" before it) only if hour of day is not (12 or 0)?
    .appendLiteral(":").appendValue(ChronoField.SECOND_OF_MINUTE, 2)
    .toFormatter();

我尝试使用< code > datetimeformatterbuilder . optional start()和< code>optionalEnd()方法,以及< code>appendOptional()方法,但是这些方法只检查被追加的字段是否存在。它们没有基于另一个字段值的可选行为。

如何使用一个格式化程序(如果可能)?

共有3个答案

蒋承教
2023-03-14
匿名用户

您可以像刚才一样使用< code > datetimeformatterbuilder . optional start(),但是您还必须创建一个包装器类来包装< code>LocalTime,其中如果小时是0或12,则< code > isSupported(SECONDS _ OF _ MINUTE)返回< code>false。

在我看来,这太麻烦了,并没有真正提高清晰度(反正不是很多)或性能。使用两个单独的格式化程序更容易。

柴阳云
2023-03-14

不知道你为什么要这样做,但你快到了:

DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder()
    .appendPattern("HH:mm");
if (t.getHour() % 12 != 0) {
    dtfb.appendLiteral(":").appendValue(ChronoField.SECOND_OF_MINUTE, 2);
}
DateTimeFormatter fmt = dtfb.toFormatter();
濮阳宜
2023-03-14

请参阅 DateTimeFormatterBuilder 和 appendText(TemporalField,Map) 方法。它允许您将每个数字转换为特定的文本片段。但是,由于您希望以小时为单位划分秒数,因此必须设置包含 86400 个条目的地图,一天中每秒一个条目。但它将作为单个格式化程序工作。

Map<Long, String> map = new HashMap<>();
map.put(0L, "00:00");
map.put(1L, "00:00");  // would normally be 00:00:01
map.put(2L, "00:00");  // would normally be 00:00:02
map.put(60L, "00:01");
// and so on
map.put(3600L, "01:00:00");
map.put(3601L, "01:00:01");
// and so on to 86399
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
  .appendText(ChronoField.SECOND_OF_DAY, map)
  .toFormatter();

包含 86400 个条目的地图当然是愚蠢的,但这是使用 API 所能做的最好的事情。真的,需要有一个 appendText(TemporalField, LongFunction

 类似资料:
  • 问题内容: 我想知道模式草案03是否可行。我已经在其他地方使用了依赖项,我认为可能需要创造性地使用它们,以便使用它们来指定某些字段的属性。 我目前的最佳尝试(无效)将使您对我的追求有所了解。我想要一个默认值,当另一个字段具有特定值时是可选值。 问题答案: 草案的第3版绝对可以做到这一点。由于您具有允许的国家/地区的完整列表,因此您可以执行以下操作: 因此,您实际上为架构定义了两种子类型,一种用于需

  • 我有一个如下所示的对象列表: 我想将其转换为如下对象列表: 基本上将同一类别的所有值相加。 我应该使用平面图吗?减少我不明白这些的细微差别。 帮助 编辑: 这个问题有密切的重复:流中是否有聚合通过方法Java8 api?和带有Stream API的对象的总和属性 但在这两种情况下,最终的结果都是地图,而不是列表 根据@AndrewTobilko和@JBNizet的回答,我使用的最终解决方案是:

  • 我有一个正在JSP中构建的Spring MVC表单,它将需要在字段中输入一个帐号。当我输入该数字时,我想对数据库运行一个查询,以拉回该特定数字的相关信息。然后,此数据将填充表单上的其他字段。 这是我在JSP中为将要输入的帐号编写的Spring绑定代码。因此,只要我输入这个数字,就会触发一个DB查询,将其他字段的数据带回来。 戴夫

  • 问题内容: 我正在处理一些旧代码/数据库,需要在数据库中添加一个字段,该字段将记录与该(外部)ID相关的序列号。 表格数据示例(当前): 我需要添加一个sequenceid列,该列分别为每个帐户递增,以实现: 请注意,该顺序与帐户有关。 有什么方法可以用SQL来实现,还是可以使用PHP脚本为我完成工作? TIA,Kev 问题答案: 这应该可以,但是可能很慢: 我称该表为“测试”;显然,需要正确设置

  • 问题内容: 我想根据其字段值获取一个特定的枚举。 枚举: 获取一个新的枚举: 我一直在尝试为上述方法带来一个枚举,以便可以将其与其他信息一起存储在其中。 预期结果: 问题答案: 供参考,这是HashMap的替代解决方案:

  • 这是我的主页,在那里我选择了一个选项字段。 opt1.php: 这是我的javascript,在这里我从上面的select获得值,并传递给opt2.php 这是我的opt2.php页面,用于显示sub select。 实际上,这并没有产生预期的结果。 有没有逻辑上或处理上的错误?