73

我正在尝试将 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 close 的形式返回日期,但还没有。

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

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

干杯!

4

8 回答 8

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

这行得通。您必须使用两种 SimpleDateFormat,一种用于输入,一种用于输出,但它会为您提供您想要的。

于 2013-03-31T15:01:49.203 回答
35
于 2016-03-17T10:44:26.167 回答
12

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);
于 2013-03-31T14:58:40.577 回答
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);

这行得通。谢谢。

于 2016-03-17T07:22:26.387 回答
3
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);

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

于 2017-02-17T09:05:00.757 回答
2

如果你真的要快(不是我相信你这样做):

char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);
于 2013-03-31T15:11:02.733 回答
2

试试这个

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

于 2021-09-23T12:29:45.387 回答
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", "")))));
于 2021-01-08T18:21:17.917 回答