如何仅使用@datetimeformat将date@configurationproperties与时间绑定?

eyh26e7m  于 2021-07-18  发布在  Java
关注(0)|答案(3)|浏览(295)

新的Spring Boot。
我正在尝试用annotation@configurationproperties解析文件中的属性。我可以解析除日期字段以外的字段。
问题是我的属性文件只有时间没有日期。i、 e.日期=09:30:00。
我可以用@datetimeformat(pattern=“hh:mm:ss”)解析它。但问题是,它给出的日期是date=thu jan 01 09:30:00 gst 1970。
我想把日期定为今天09:30:00。有可能吗?

@ConfigurationProperties
public class Config {

    private int id;

    private int version;

    @DateTimeFormat(pattern = "HH:mm:ss")
    private Date date;

}

财产

id=12
version=2
date=09:30:00
v1l68za4

v1l68za41#

为什么不使用仅表示时间的类型?

@DateTimeFormat(pattern = "HH:mm:ss")
    private LocalTime time;

    public LocalDateTime getDate() {
        return LocalDateTime.of(LocalDate.now(), time);
    }
c86crjj0

c86crjj02#

由于字符串被解析为 java.util.Date 使用 SimpleDateFormat 默认日期时间为 January 1, 1970, 00:00:00 GMT .

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) throws ParseException {
        String text = "09:30:00";
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        Date date = sdf.parse(text);
        System.out.println(date);
    }
}

我所在时区的输出(欧洲/伦敦):

Thu Jan 01 09:30:00 GMT 1970

请注意 java.util.Date 对象不是像现代日期时间类型那样的实时日期时间对象;相反,它表示自称为“epoch”的标准基准时间以来的毫秒数,即 January 1, 1970, 00:00:00 GMT (或utc)。打印对象时 java.util.Date ,其 toString 方法返回jvm时区中的日期时间,该值是从该毫秒值计算出来的。如果需要在不同的时区打印日期时间,则需要将时区设置为 SimpleDateFormat 并从中获取格式化字符串。这个 java.util 日期时间api及其格式api, SimpleDateFormat 不仅过时而且容易出错,因为许多这样的事情。建议完全停止使用它们,并切换到现代日期时间api1。
下面给出了几个选项:
推荐:使用 LocalTime 真正代表时间。

@DateTimeFormat(pattern = "HH:mm:ss")
    private LocalTime time;

肮脏的方式:将你的领域声明为 String 并在您的业务逻辑中对其进行解析,从而使其容易出错并变得肮脏。

private String time;

我强烈建议不要选择第二种选择。
使用 LocalTime :

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String text = "9:30:00";

        // The optional part can be put inside square bracket
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("H:m[:s]", Locale.ENGLISH);
        LocalTime time = LocalTime.parse(text, dtfInput);

        // Default implementation of LocalTime#toString omits the seconds part if it is zero
        System.out.println(time);

        // Custom output
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.ENGLISH);
        String formatted = dtfOutput.format(time);
        System.out.println(formatted);
    }
}

输出:

09:30
09:30:00

从trail:date-time了解有关现代日期时间api的更多信息。
1.出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。

aemubtdh

aemubtdh3#

不要使用陈旧过时的上课日期。查看包java.time,特别是您的案例类localtime。
将代码更改为:@configurationproperties public class config{

private int id;

private int version;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
private LocalTime date;

}
这应该管用。您可能需要添加以下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.6.0</version>
</dependency>

这是这个问题的修改后的答案:SpringDataJPA-ZoneDateTime格式,用于json序列化

相关问题