首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将UTC字符串日期转换为日期格式

将UTC字符串日期转换为日期格式
EN

Stack Overflow用户
提问于 2020-09-24 20:04:58
回答 2查看 114关注 0票数 0

如何在java中将字符串2020-09-02T12:22:53.9转换为日期格式2020-09-02T12:22:53.9?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String dateString = "2020-09-02T12:22:53.9";
String tz = "America/Mexico_City";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-mm hh:mm:ss.S");
ZoneId zoneId = ZoneId.of(tz);
Instant instant = Instant.parse(dateString);
ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(dateTimeInTz.format(dtf));

这段代码从Instant instant = Instant.parse(dateString);行抛出一个java.time.format.DateTimeParseException: Text '2020-09-02T12:22:53.9' could not be parsed at index 21

EN

回答 2

Stack Overflow用户

发布于 2020-09-24 20:11:30

格式不正确。您使用的是mm,而不是MM。此外,您还遗漏了格式中的文字T。请注意,您需要将HH用于24小时格式化时间。

由于日期-时间字符串没有时区信息,因此必须将日期-时间字符串解析为LocalDateTime,然后使用LocalDateTime#atZone将其转换为ZonedDateTime (如果需要ZonedDateTime),如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateString = "2020-09-02T12:22:53.9";

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:ss.S");

        String tz = "America/Mexico_City";
        ZoneId zoneId = ZoneId.of(tz);

        // Parse the given date-time string to LocalDateTime
        LocalDateTime ldt = LocalDateTime.parse(dateString, dtf);

        // Convert the LocalDateTime to ZonedDateTime
        ZonedDateTime dateTimeInTz = ldt.atZone(zoneId);

        // Display ZonedDateTime in its default format
        System.out.println(dateTimeInTz);

        // Display ZonedDateTime in your custom format
        System.out.println(dateTimeInTz.format(dtf));
    }
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-02-09T12:22:53.900-06:00[America/Mexico_City]
2020-09-02T12:22:53.9

或者,您可以将ZoneIdDateTimeFormatter本身一起使用,然后可以将给定的日期-时间字符串直接解析为ZonedDateTime,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateString = "2020-09-02T12:22:53.9";

        String tz = "America/Mexico_City";
        ZoneId zoneId = ZoneId.of(tz);

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:ss.S").withZone(ZoneId.of(tz));

        // Parse the given date-time string into ZonedDateTime
        ZonedDateTime dateTimeInTz = ZonedDateTime.parse(dateString, dtf);

        // Display ZonedDateTime in its default format
        System.out.println(dateTimeInTz);

        // Display ZonedDateTime in your custom format
        System.out.println(dateTimeInTz.format(dtf));
    }
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-02-09T12:22:53.900-06:00[America/Mexico_City]
2020-09-02T12:22:53.9
票数 2
EN

Stack Overflow用户

发布于 2020-09-25 00:16:30

不需要格式化程序

我认为您的日期字符串在美国/墨西哥城市时区,并且您希望输出在相同的时区,因此相同的日期和时间。我进一步认为,在程序内部,您希望将时间点表示为Instant。从日期字符串到Instant再返回的整个圆圈可能是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    String tz = "America/Mexico_City";
    ZoneId zoneId = ZoneId.of(tz);
    
    String dateString = "2020-09-02T12:22:53.9";
    
    Instant instant = LocalDateTime.parse(dateString).atZone(zoneId).toInstant();
    System.out.println(instant);
    
    ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
    System.out.println(dateTimeInTz.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

输出:

2020-09-02T17:22:53.900Z 2020-09-02T12:22:53.9

您的输入和相同的输出采用ISO 8601格式。LocalDateTime解析ISO8601格式时不使用时区或偏移量作为其默认值,也就是说,不使用任何显式格式化程序。为了以相同的格式打印ZonedDateTime,我们使用内置的DateTimeFormatter.ISO_LOCAL_DATE_TIME。到目前为止,您可能已经意识到,从指定我们自己的格式模式字符串中解脱出来是一大解脱。

你的代码出了什么问题?

Arvind Kumar Avinash已经报告了格式模式字符串中的错误。更根本的是,您无法将字符串解析为Instant,或者更准确地说,需要更多的东西才能做到这一点。原因是Java和Instant类不知道也不能猜测您想要的时区。您的日期字符串包含不带任何时区的日期和时间。Instant是一个时间点,概念上没有任何日期或时间。字符串可以表示不同时区中的不同时间点,因此只有通过指定时区才能确定时间点。

Instant类可以解析的是用Z表示的日期和时间。上面的Instant 2020-09-02T17:22:53.900Z的输出中就有这样一个字符串的例子。由于您的字符串不是UTC格式的(因此没有Z),这种观察对我们的情况没有帮助。

链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64053655

复制
相关文章
oracle中number的用法,Oracle Number数字
在本教程中,您将学习Oracle NUMBER数据类型以及如何使用它来为表定义数字列。
全栈程序员站长
2022/09/15
1.7K0
Flutter 中FlatButton的替代方案
最新版本的Flutter已将FlatButton标记为过时,我们可以使用 TextButton 或 ElevatedButton 来进行替代,FlatButton 与替代组件的参数会有差异。
xiangzhihong
2023/07/09
6610
oracle number整数,Oracle number类型的语法和用法
1. 精度(precision),或总位数。默认情况下,精度为38位,取值范围是1~38之间。也可以用字符*表示38。
全栈程序员站长
2022/09/15
2.5K0
oracle的number类型
p : 精度位precision,数据的有效位;取值范围38;默认38;*表示38
全栈程序员站长
2022/09/15
6550
Electron中remote模块的替代方案
在Electron12时候被废弃,使用必须配置enableRemoteModule
码客说
2023/09/14
2K0
Oracle中number数据类型的存储机制
Oracle中number数据类型存储的是整型,碰巧看到这篇文章讲解了通过分析索引了解0和1的存储机制,值得学习一下。
bisal
2023/01/13
9970
Java中的大量if else语句的替代方案
之前写过转载过一篇类似的不错的文章《除代码中的 if-else/switch-case的正确姿势》https://blog.csdn.net/w605283073/article/details/89117561,
明明如月学长
2021/08/31
1.8K0
Linux 中 cron 系统的 4 种替代方案
cron 适用于长期重复任务。如果你设置了一个工作任务,它会从现在开始定期运行,直到计算机报废为止。但有些情况下你可能只想设置一个一次性命令,以备不在计算机旁时该命令可以自动运行。这时你可以选择使用 at 命令。
用户1880875
2021/09/07
2.5K0
Base:Acid的替代方案
作者:DAN PRITCHETT 译者:java达人 来源:https://queue.acm.org/detail.cfm?id=1394128(点击阅读原文前往) 在数据库分区中,以一致性换取可
java达人
2018/03/26
2.3K0
Base:Acid的替代方案
Web 框架的替代方案
在本系列第二部分中,Noam 提出了一些模式,说明如何直接用 Web 平台作为框架提供的一些解决方案的替代方案。
深度学习与Python
2022/04/19
2.6K0
Hugo .GitInfo 的替代方案
今天有人问我博客页脚 footer 里的 git hash 是怎么显示的,就是页面底部里的 69d6ffe 这一串数字。
eallion
2022/12/20
1.9K0
Hugo .GitInfo 的替代方案
如何将SQLServer2005中的数据同步到Oracle中
有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据。不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现。假设我们这边(SQLServer2005)有一个合同管理系统,其中有表contract 和contract_project是需要同步到一个MIS系统中的(Oracle9i)那么,我们可以按照以下几步实现数据库的同步。
深蓝studyzy
2022/06/16
3K0
oracle number数据类型的精度
p: 1—38 s: -84—127 a、s > 0 (精确到小数点右边 s 位,并四舍五入 。然后检验有效数位是否 <= p) 例如:number(5,2) 有效数字最多是5位,保留小数点后2位; 123.45 — 123.45 123 — 123.00 1.2356 — 1.24 0.001 — 0.00 b、s < 0 (精确到小数点左边 s 位,并四舍五入 。然后检验有效数位是否 <= p + |s|) 例如:number(5,-2) 小数点左边最后2位四舍五入,最多7位有效数字 123456 — 123460 1234567.6789 — 1234600 1 — 0 总结:在 p < s 这种情况下 只能用来存放大于0小于1的小数。 在 p > s 这种情况下 小数点前最多只能插入:p – s个数字,但小数点后的数字可以是任意长度(保存时会四舍五入)
全栈程序员站长
2022/09/15
1.3K0
Oracle number类型的语法和用法
摘要:先根据精度值,对number类型的数据从左边第一个非零数字开始数精度值个位数,之后的位数截断不要(要四舍五入吗),再根据小数位置值,对number类型的数据右边的低位进行四舍五入(如果小数位置值为负的,如何处理?)
全栈程序员站长
2022/09/15
2.3K0
CentOS 8/6 Linux 生命终结,2022 年最好的替代方案是什么?
◆ 前言 Red Hat 最近宣布,CentOS 8 Linux将不再支持并在 2021 年底停止使用。取而代之的是滚动版本 CentOS Stream 作为 RHEL 的下游分支于 2019 年推出,将持续排查漏洞,让上游版本更加稳定和安全。 但是,运行 CentOS 7 的服务器不会受到影响。他们将与 RHEL 7 生命周期并行更新。RHEL 7 将在 2024 年结束其最后一个维护周期。 但是,如果您使用的是 CentOS 8,那么 2022 年有哪些替代方案?不幸的是,即使您找到了,服务器应用程序的
IT大咖说
2022/03/08
6.4K0
oracle number转为timestamp timestamp转number
现在平台有个字段是用来记录插入时间的,但是是用number型存储,想转为时间类型的。 结果: SELECT TO_CHAR(字段名 / (1000 * 60 * 60 * 24) + TO_DATE(‘1970-01-01 08:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘YYYY-MM-DD HH24:MI:SS’) AS CDATE FROM 表名; 解决问题的过程: http://blog.csdn.net/a9529lty/article/details/5306622
全栈程序员站长
2022/09/15
2.1K0
Oracle number数据类型的使用[通俗易懂]
第一种情况: number后面都是两个正数,第一个数表示有效位,第二个数表示小数点后的位数(也就是精确度,需要进行四舍五入) 例如
全栈程序员站长
2022/09/15
6040
点击加载更多

相似问题

Spring数据-@修改(clearAutomatically= true,flushAutomatically = true)导致另一个实体不被更新

11

我可以在接口上使用spring注解吗?

14

调试时,我可以“跳过”jQuery代码吗?

51

我可以将注解注入pojo吗?

11

使用Kwargs时,我可以在Python中跳过参数吗?

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文