Java 8与Spring Boot中如何为Game实例传递Instant时间参数
解决Game实例添加Instant时间戳的问题
首先,咱们先梳理下你当前代码里的几个核心问题,然后一步步重构,让每个Game实例都能正确带上Instant类型的创建时间。
一、修复Game类的语法与逻辑错误
你原来的of方法存在语法错误(导致.atZone标红)、方法设计问题,还有日期处理的用法错误。咱们先重构Game类,确保它能正确存储Instant时间:
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @Entity public class Game { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 新增Instant类型的字段,存储创建时间 private Instant creationDate; // JPA要求的无参构造方法,这里可以默认设置当前时间 public Game() { this.creationDate = Instant.now(); } // 带参数的构造方法,允许外部传入指定的Instant public Game(Instant creationDate) { this.creationDate = creationDate; } // 修正你原来想写的静态工厂方法 public static Game of(Instant instant) { return new Game(instant); } // 如果你需要从LocalDateTime转换为Instant的场景,提供这个工厂方法 public static Game fromLocalDateTime(LocalDateTime localDateTime, ZoneId zoneId) { // 这里就是正确的.atZone用法:先有LocalDateTime实例,再调用实例方法 Instant instant = localDateTime.atZone(zoneId).toInstant(); return new Game(instant); } // Getter和Setter方法(JPA和后续读取时间需要) public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Instant getCreationDate() { return creationDate; } public void setCreationDate(Instant creationDate) { this.creationDate = creationDate; } // 重写toString,方便查看实例信息 @Override public String toString() { return "Game{" + "id=" + id + ", creationDate=" + creationDate + '}'; } }
解释你原来的.atZone标红原因:
- 语法错误:你写的
LocalDateTime .atZone是直接用类名调用实例方法,而且中间多了空格——.atZone是LocalDateTime实例的方法,必须先创建LocalDateTime的对象(比如LocalDateTime.now())才能调用。 - 方法名错误:
ToInstant()应该是toInstant(),Java方法名遵循驼峰式,首字母必须小写。 - 无意义代码:这行代码没有赋值给任何变量,执行后不会产生任何效果,必须把转换后的Instant赋值给变量才能使用。
二、修改SalvoApplication,传递参数创建Game实例
现在Game类已经支持传入Instant参数,咱们修改initData方法,创建Game时可以指定时间,或者用默认的当前时间:
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @SpringBootApplication public class SalvoApplication { public static void main(String[] args) { SpringApplication.run(SalvoApplication.class, args); } @Bean public CommandLineRunner initData(GameRepository repository) { return (args) -> { // 方式1:使用无参构造,自动设置当前时间 repository.save(new Game()); // 方式2:传入指定的Instant(比如解析一个固定时间字符串) Instant specificInstant = Instant.parse("2020-03-30T12:28:00Z"); repository.save(new Game(specificInstant)); // 方式3:用LocalDateTime转Instant后创建Game LocalDateTime localDateTime = LocalDateTime.of(2020, 3, 30, 12, 28); repository.save(Game.fromLocalDateTime(localDateTime, ZoneId.systemDefault())); }; } }
三、额外提示:格式化Instant为可读时间
如果需要把Instant类型的时间展示成友好的字符串(比如在控制台或前端),可以用DateTimeFormatter:
import java.time.format.DateTimeFormatter; // 在需要展示的地方使用 Game game = repository.findById(1L).orElse(null); if (game != null) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") .withZone(ZoneId.systemDefault()); String formattedDate = formatter.format(game.getCreationDate()); System.out.println("Game创建时间:" + formattedDate); }
内容的提问来源于stack exchange,提问作者Nikita99
相关产品推荐
相关产品推荐

