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

时间:2013-03-31 14:13:35

标签: 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);

但这会产生类似于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

干杯!

7 个答案:

答案 0 :(得分:73)

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,一个用于输入,一个用于输出,但它会为你提供你想要的东西。

答案 1 :(得分: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);

答案 2 :(得分:8)

java.time

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

您的输入字符串采用标准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就是这样做的。

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

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

Simply String Manipulations

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

关于 java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

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

答案 3 :(得分:3)

我试图格式化从JSON响应中收到的日期字符串,例如2016-03-09T04:50:00-0800到yyyy-MM-dd。所以这就是我尝试过的,它起作用并帮助我为格式化的日期字符串分配日历小部件。

String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss";
String DATE_FORMAT_O = "yyyy-MM-dd";


SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I);
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O);

Date date = formatInput.parse(member.getString("date"));
String dateString = formatOutput.format(date);

这很有用。感谢。

答案 4 :(得分:1)

如果你真的要快(不是我相信你的话):

char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);

答案 5 :(得分:1)

我有一个案例,我将旧式 DB2 z/os 数据库时间戳(格式为:"yyyy-MM-dd'T'HH:mm:ss.SSSZ")转换为 SqlServer 2016 datetime2(格式为:"yyyy-MM-dd HH:mm:ss.SSS)字段,该字段由我们的Spring/Hibernate Entity Manager 实例(在本例中为 OldRevision 表)。在Class中,我将日期定义为java.util类型,并按照正常方式编写setter和getter。然后,在处理数据时,我处理与此问题相关的数据的代码如下所示:

OldRevision revision = new OldRevision();
String oldRevisionDateString= oldRevisionData.getString("originalRevisionDate", "");
Date oldDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ");
oldDateFormat.parse(oldRevisionDateString);
SimpleDateFormat newDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
newDateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
Date finalFormattedDate= newDateFormat.parse(newDateFormat.format(oldDateFormat));
revision.setOriginalRevisionDate(finalFormattedDate);
em.persist(revision);

处理相同情况的更简单方法是:

SimpleDateFormat newDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
newDateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
revision.setOriginalRevisionDate(
        newDateFormat.parse(newDateFormat.format(
                new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ")
                        .parse(rs.getString("originalRevisionDate", "")))));

答案 6 :(得分:0)

String dateStr = "2016-09-17T08:14:03+00:00";
String s = dateStr.replace("Z", "+00:00");
s = s.substring(0, 22) + s.substring(23);
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s);
Timestamp createdOn = new Timestamp(date.getTime());
mcList.setCreated_on(createdOn);

根据ISO 8601,Java 7增加了对时区描​​述符的支持。这可以在Java 7中使用。