如何将字符串转换为带有时区的时间戳?
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 中的现代解决方案。以上是关于如何将字符串转换为带有时区的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章