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

Spring boot 2转换java 8应用程序的持续时间。属性

公孙成仁
2023-03-14

我需要定义持续时间值(spring.redis.timeout)application.properties.

我试图使用Spring boot文档中定义的一点:

Spring Boot专门支持表示持续时间。如果您公开了一个java。时间属性,应用程序属性中提供以下格式:

java使用的标准ISO-8601格式。util。持续时间一种可读性更强的格式,其中值和单位是耦合的(例如,10s表示10秒)

当我使用Spring时。redis。timeout=3sSpring启动应用程序引发此异常:

无法将类型'java.lang.String'的值转换为所需类型'java.time.Duration':未找到匹配的编辑器或转换策略

哪种方法是在应用程序中为Duration属性设置正确值的最佳方法。去年Springboot 2发行版的属性?

共有3个答案

邓嘉致
2023-03-14

当前的Duration(Spring-Boot 2.0.4. RELEASE)不能与@Value表示法一起使用,但可以与@ConfigurationProperties一起使用

对于Redis,您有RedisProperties,可以使用配置:

spring.redis.timeout=5s

以及:

@SpringBootApplication
public class DemoApplication {

  @Autowired
  RedisProperties redisProperties;

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

  @PostConstruct
  void init() {
    System.out.println(redisProperties.getTimeout());
  }
}

它打印(解析为5s):

PT5S

https://docs.oracle.com/javase/8/docs/api//java/time/Duration.html#parse-java。lang.CharSequence-

蔡理
2023-03-14

可以在Spring表达式语言中使用@值表示法

@Value("#{T(java.time.Duration).parse('${spring.redis.timeout}')}")
private Duration timeout;
史英睿
2023-03-14

任何类型为duration的属性都可以通过注入。属性或。yml文件。你需要做的就是使用正确的格式。

如果要注入持续时间为5秒,则应将其定义为PT5Spt5sPT5s

  • 字母的大小写无关紧要,所以你可以使用任何对你来说可读的组合
  • 一般大家都用大写字母

其他示例

PT1.5S       = 1.5 Seconds
PT60S        = 60 Seconds
PT3M         = 3 Minutes
PT2H         = 2 Hours
P3DT5H40M30S = 3Days, 5Hours, 40 Minutes and 30 Seconds

您还可以使用ve和-ve符号来表示积极与消极的时间段。

  • 您只能对其中一个实体求反,例如:PT-3H30M=-3小时30分钟,基本上是-2.5小时
  • 或者你可以否定整个实体:-PT3H30M=-3小时-30分钟,基本上是-3.5小时
  • 双负在这里也起作用:-PT-3H 30M=3小时-30分钟,基本上是2.5小时

注:

  • 持续时间只能在HOURS或更低的ChronoUnit(NANOSMICROSMILLIS分钟HOURS)中表示,因为它们表示准确的持续时间
  • 不允许使用更高的ChronoUnit(DAYSWEEKSMONTHSYEARSDECADESCENTURIESMILLENNIAERASFOREVER),因为它们不代表准确的持续时间。这些ChronoUnit具有估计的持续时间,因为天数可能因夏令时而变化,月有不同的长度等。
  • 异常-Java自动将DAYS转换为HOURS,但它不会为任何其他更高的ChronoUnit(MONTHSYEARS等)执行此操作。

如果我们尝试做一个“P1D”,java会自动将其转换为“PT24H”。因此,如果我们想要持续1个月,我们必须使用PT720H或P30D。在P30D的情况下,java的自动转换将发生,并给我们提供PT720H

赞成,如果它对你有用或者你喜欢这个解释。谢谢,

 类似资料:
  • 我正在尝试获取jQuery addClass 演示问题:在构建演示时遇到了一个奇怪的问题——jQuery函数在我的实际网站上不起作用。不确定这是为什么,但声明它找不到变量“hoverAwayFromWindows”或“hoverOverWindows”——但这没有意义,因为它们是函数,而不是变量。 转换持续时间问题:只要父div悬停在上面,子div就会立即应用“悬停在windows样式上”类,但我

  • 目前,当您获得youtube持续时间时,您会获得类似的内容。 下面的代码将其更改为。然而,我希望只获得SECONDS,因此将是输出。

  • 我需要一些解释为什么这个代码不编译: 错误: 类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit) 正如本文所述: public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间

  • 我怎么能看到它?在portal中,我发现了一个选项,可以看到会话计数,但不是持续时间。

  • 我正在寻找一种从“ISO 8601持续时间格式”(P0DT0H0M0S)转换为小时的便捷方法。 到目前为止,我想到了这个: 如您所见,我的方法是将数字拆分并乘以24、1、1/60、1/3600以得到小时。我可以减少代码量吗? 样本数据和所需结果 输入: 'P1DT2H3M44S' (1 天 2 小时 3 分 44 秒) 期望输出: 26.062222222222222 (这是小时)

  • 我有ISO8601格式的持续时间值,我将其转换为时间值为整数秒,如下所示: ISO8601格式的持续时间值=“P1Y”。 我将该值存储在“时间-单位-秒”中。因此,当我检索的值将是在int,我想转换回ISO8601持续时间格式,所以我应该得到“P1Y”转换后回来。 有没有快速的方法可以做到这一点?或者我必须把时间的int值转换成float,然后通过某种方法把它转换成ISO8601持续时间。