Java format yyyy-MM-dd'T'HH:mm:ss.SSSz to yyyy-mm-dd HH:mm:ssjava.time简单的字符串操作关于 java.time

2022-08-31 13:09:16

我正在尝试在y-MM-dd'T'HH:mm:ss中格式化日期。SSSz 格式为 yyyy-mm-dd HH:mm:ss,这应该很容易,但我无法让它工作。

必须解析的日期格式为: 2012-10-01T09:45:00.000+02:00
现在我使用这个简单的日期格式化程序来格式化它:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE);

然而,这给出了类似于2012-10-01T09:45:00.000UTC + 00:00的输出。

我也尝试过使用“yy-MM-dd'T'HH:mm:ss.SSSZ“作为模式和”yyyy-MM-ddHH:mm:ss”。后者以 2012-10-01T09:45:00 关闭的形式返回日期,但尚未返回。

我认为将T子字符串移开会有点混乱,并且无缘无故地产生开销,因此格式化这些日期的正确方法是什么?

为了说明,我想将2012-10-01T09:45:00.000 + 02:00转换为2012-10-01 09:45:00

干杯!


答案 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(time);
String formattedTime = output.format(d);

这有效。你必须使用两个SimpleDateFormats,一个用于输入,一个用于输出,但它会给你你想要的东西。


答案 2

java.time

我们有针对这个问题的新技术:Java.time框架内置于Java 8及更高版本中。

您的输入字符串采用标准 ISO 8601 格式。默认情况下,该标准在 java.time 类中用于解析/生成日期时间值的文本表示形式。

OffsetDateTime odt = OffsetDateTime.parse( "2012-10-01T09:45:00.000+02:00" );

您的问题表明您想要截断到整整一秒钟。

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo( ChronoUnit.SECONDS );

似乎您要省略偏移量和时区信息。预定义的格式化程序 DateTimeFormatter.ISO_LOCAL_DATE_TIME 可以做到这一点。

显然,您希望在中间使用空格而不是标准 。您可以为此定义自己的格式化程序,但我只是执行字符串操作以将 替换为空格。TT

String output = odtTruncatedToWholeSecond.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " );

简单的字符串操作

正如对问题的评论所表明的那样,严格来说,您可以通过仅使用字符串而不转换为任何日期时间对象来实现目标。但是,我在这里提供此答案,假设您可能有其他业务逻辑来处理这些日期时间值。


Table of date-time types in Java, both modern and legacy


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

从哪里获取 java.time 类?

Table of which java.time library to use with which version of Java or Android

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter