Java格式yyyy-MM-dd'T'HH:mm:ss.SSSz到yyyy-mm-dd HH:mm:ss

Goo*_*oey 44 java parsing date simpledateformat

我正在尝试将yyyy-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);
Run Code Online (Sandbox Code Playgroud)

但是这给出了类似于2012-10-01T09的输出:45:00.000UTC + 00:00.

我也尝试使用"yyyy-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

干杯!

ctl*_*evi 79

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);
Run Code Online (Sandbox Code Playgroud)

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


Bas*_*que 11

java.time

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

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

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

你的问题建议你要截断一整秒.

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo( ChronoUnit.SECONDS );
Run Code Online (Sandbox Code Playgroud)

您似乎想要省略偏移和时区信息.预定义的格式化程序就是DateTimeFormatter.ISO_LOCAL_DATE_TIME这样做的.

显然你想在中间使用一个空间而不是标准空间T.您可以为此定义自己的格式化程序,但我只是执行字符串操作来替换TSPACE.

String output = odtTruncatedToWholeSecond.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " );
Run Code Online (Sandbox Code Playgroud)

简单的字符串操作

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


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

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

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.

  • @Sangram实际上,不是,不仅仅是Java8。在[ThreeTen-Backport](http://www.threeten.org/threetenbp/)项目中,许多java.time功能都被反向移植到Java 6和Java 7。并在[ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP)项目中进一步适应了Android。 (2认同)

小智 8

Gooye如果可以在你的项目中使用Joda Time,那么这段代码对我有用:

String dateStr = "2012-10-01T09:45:00.000+02:00";
String customFormat = "yyyy-MM-dd HH:mm:ss";

DateTimeFormatter dtf = ISODateTimeFormat.dateTime();
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr);

String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat));
System.out.println(dateWithCustomFormat);
Run Code Online (Sandbox Code Playgroud)

  • 添加更多依赖项.它存在于JDK中,请参阅Chris Tate的回答 (2认同)