我正在开发一个网络应用程序.当用户注册时,他们的注册日期时间需要准确地存储在数据库中,然后显示在网站管理员查看的前端中.

我想确保显示的DateTime是正确的from the perspective of the user viewing the page, regardless of their timezone.

如果一个用户在纽约中午注册,伦敦的某个人可能会看到"用户今天下午5点注册".这包括夏令时(如果适用).

在Spring Boot中,我使用这个注释来存储创建时间戳,并且我正在try 确定这里使用的类是否合适:

@CreationTimestamp
@Column(name = "created_at")
public OffsetDateTime created_at;

但想到这一点,我很困惑.我是否需要存储ZonedDateTime,或者我是否可以实际存储一个时间戳(Instant),然后根据发出请求的人稍后添加区域信息?使用上面的示例,这将是:

ZonedDateTime responseZonedDateTime = instant.atZone(ZoneId.of("Europe/London"));

这里的时区来自请求处理程序,例如

@GetMapping
public String getUser(TimeZone timezone) { }

这似乎需要做很多工作,也许还有更好的解决方案?

(如果与此相关,我使用的是PostgreSQL,列类型为TIMESTAMP WITH TIME ZONE.)

推荐答案

您可以使用Java的Instant来保存时间戳.不需要在您描述的用例中保存时区.为了显示发出请求的用户所在时区的时间戳,您可以使用能够将UTC时间戳转换为客户端时区的客户端库(例如,Dayjs、Momentjs等).

只有当您想要显示/知道用户在其时区注册的时间时,保存时区才有意义.

Java相关问答推荐

如何让TaskView总是添加特定的列来进行排序?

强制Mockito返回null而不是emtpy list

Spring boot:Bean和动态扩展器

在现代操作系统/硬件上按块访问数据值得吗?

无法在org. openjfx:javafx—fxml:21的下列变体之间进行 Select

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

AssertJ Java:多条件断言

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

Spring-Boot Kafka应用程序到GraalVM本机映像-找不到org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier

AbstractList保证溢出到其他方法

有没有办法知道在合并中执行了什么操作?

如何从命令行编译包中的所有类?

在实例化中指定泛型类型与不指定泛型类型之间的区别

协同 routine 似乎并不比JVM线程占用更少的资源

Bash数组的单引号元素并使用空格连接

将基于实例编号的对象列表拆分为新的对象列表

保持标题窗格的箭头可见,即使设置为不可折叠

简化每个元素本身都是 map 列表的列表

无泄漏函数的Java DRY

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?