Java 格式 yyyy-MM-dd‘ T’HH: mm: ss.SSSz to yyyy-MM-dd HH: mm: ss

我正在尝试将日期格式化为 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.000 UTC + 00.00。

我还尝试使用“ yyyy-MM-dd‘ T’HH: mm: ss.SSSZ”作为模式和“ yyyy-MM-ddHH: mm: ss”。后者以2012-10-01 T09:45:00 close 的形式返回一个日期,但还没有到那里。

我认为把 T 字符串去掉会有点麻烦,而且会无缘无故地产生开销,因此怎样才是格式化这些日期的正确方法呢?

为了说明,我想把2012-10.01 T09:45:00.000.02:00转换成2012-10.0109:45:00

干杯!

467394 次浏览

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);
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,一种用于输入,一种用于输出,但是它将提供您所需要的内容。

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

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

我试图格式化从 JSON 响应收到的日期字符串,例如2016-03-09T04:50:00-0800 to 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);

成功了,谢谢。

爪哇时间

针对这个问题,我们有了新的技术: 内置在 Java8及更高版本中的 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替换为一个 SPACE。

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

简单的字符串操作

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


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


关于 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

现在在 维修模式中的 尤达时间项目建议迁移到 爪哇时间类。

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

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

从哪里获得 java.time 类?

  • Java SE 8 < strong > JavaSE9 和更高版本
    • 内置的。
    • 带有捆绑实现的标准 JavaAPI 的一部分。
    • Java9添加了一些次要的特性和修复。
  • Java SE 6 和 < a href = “ https://en.wikipedia.org/wiki/Java _ version _ history # Java _ SE _ 7”rel = “ noReferrer”> < strong > Java SE 7
  • 仿生人
    • Java.time 类的 Android 捆绑包实现的后续版本。
    • 对于早期的 Android,项目适用于 310-后端口(上面提到过)。

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

< strong > Three Ten-Ultra 项目使用其他类扩展 java.time。这个项目是将来可能添加 java.time 的试验场。您可以在这里找到一些有用的类,比如 IntervalYearWeekYearQuarter更多

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);

Java7根据 ISO8601增加了对时区描述符的支持。

我有一个案例,我正在将一个遗留的 DB2 z/os 数据库时间戳(格式为: "yyyy-MM-dd'T'HH:mm:ss.SSSZ")转换为 SqlServer 2016 datetime2(格式为: "yyyy-MM-dd HH:mm:ss.SSS)字段,该字段由 Spring/Hibernate 实体管理器实例(在本例中是 OldRevisionTable)处理。在 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", "")))));

试试这个

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");


SimpleDateFormat output = new SimpleDateFormat("yyyyMMddHHmmss");


Date d = sdf.parse("2021-09-23T22:05:18.884Z");


String formattedTime = output.format(d);


System.out.println(formattedTime);

结果: 20210923220518

尝试下面的代码。

public static void main(String[] args) {
String str = "18-09-22 02:40:16";
DateTimeFormatter df = DateTimeFormatter.ofPattern("dd-MM-yy HH:mm:ss", Locale.UK);
LocalDateTime parse = LocalDateTime.parse(str, df);
System.out.println("old output = " + parse);
String output = parse.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " );
System.out.println("output = " + output);
}

成功了。

产出:

enter image description here