如何将字符串转换为带有时区的时间戳?

Posted

技术标签:

【中文标题】如何将字符串转换为带有时区的时间戳?【英文标题】:How can I convert String to timestamp with timezone? 【发布时间】:2021-08-30 05:44:54 【问题描述】:

在我的 Spring Boot 项目中,我有这个对象数组 (List<Object> values)

["2021-06-13T08:50:04.707Z", 3197691, 1933]

第一个元素是一个字符串,代表一个带有时区的时间戳

我可以像这样得到第一个元素:

String time = (String) values.get(0);

如何将其转换为日期或时间格式以便插入到 PostgreSQL 表中?

【问题讨论】:

你想把它转换成 sql 吗?如果是,那么在您的查询中,您可以编写类似 select '2021-06-13T08:50:04.707Z'::timestamp 的内容 您希望在哪种编程语言或环境中执行此操作? 对不起,我正在使用 Java 和 Spring 【参考方案1】:

给定的时间戳字符串符合 ISO 8601 标准。

modern Date-Time API* 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter 对象。

演示:

import java.time.OffsetDateTime;

public class Main 
    public static void main(String[] args) 
        OffsetDateTime odt = OffsetDateTime.parse("2021-06-13T08:50:04.707Z");
        System.out.println(odt);
    

输出:

2021-06-13T08:50:04.707Z

查看this answer,了解如何将OffsetDateTime 与 JDBC 结合使用。

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。

【讨论】:

【参考方案2】:

首先你必须了解时间戳的格式,而对于你的时间戳格式是

yyyy-MM-dd'T'hh:mm:ss.SSS'Z'

别忘了添加'T''Z'

然后,要将字符串日期转换为 Date 类,您可以使用 SimpleDateFormat 类

String dateInString = "2021-06-13T08:50:04.707Z";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'");
Date date = dateFormat.parse(dateInString);

然后使用data 对象插入到您的查询中。或者,如果您使用 JPA,只需创建实体并将 data 对象放入变量即可。

【讨论】:

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,转用modern Date-Time API。 @ArvindKumarAvinash 感谢您提供的信息。将阅读有关此内容的更多信息。 rioswawawan - 你应该学习的另一件事是'Z' is not the same as Z 请不要教年轻人使用陈旧过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。在格式模式字符串中引用 Z 也是错误的。 Z 是与 UTC 的偏移量(0),需要将其解析为偏移量,否则您将得到错误的时间点。最后小写hh 也是错误的。 (A)永远不要Z 放在像'Z' 这样的单引号内。这样做会告诉解析器忽略什么是关键信息:零时分秒的 UTC 偏移量。 (B) 而且,正如其他人评论的那样,您正在使用 terrible 类,这些类在几年前被 java.time 类所取代。查看Answer by Arvind Kumar Avinash 中的现代解决方案。

以上是关于如何将字符串转换为带有时区的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

如何将时间戳转换为字符串(不更改时区)?

如何将“字符串”转换为“没有时区的时间戳”

js 如何把一个本地时间 转换为其他时区的时间

TO_TIMESTAMP_TZ 功能

将带时区的字符串转换为 unix 时间戳

PostgreSQL:将字符串转换为没有时区的时间戳以更改时间日期时,我得到了意想不到的结果